{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 基于物品协同过滤的推荐"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2017-09-26T05:34:54.624167Z",
     "start_time": "2017-09-26T05:34:46.420964Z"
    }
   },
   "outputs": [],
   "source": [
    "# -*- coding:utf-8 -*-\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "import sys\n",
    "import importlib\n",
    "importlib.reload(sys)\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns \n",
    "%matplotlib inline "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据\n",
    "用户(10万)、歌曲（3万）、播放次数、歌曲元数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>song</th>\n",
       "      <th>listen_count</th>\n",
       "      <th>title</th>\n",
       "      <th>release</th>\n",
       "      <th>artist_name</th>\n",
       "      <th>year</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOADQPP12A67020C82</td>\n",
       "      <td>12</td>\n",
       "      <td>You And Me Jesus</td>\n",
       "      <td>Tribute To Jake Hess</td>\n",
       "      <td>Jake Hess</td>\n",
       "      <td>2004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOAFTRR12AF72A8D4D</td>\n",
       "      <td>1</td>\n",
       "      <td>Harder Better Faster Stronger</td>\n",
       "      <td>Discovery</td>\n",
       "      <td>Daft Punk</td>\n",
       "      <td>2007</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOANQFY12AB0183239</td>\n",
       "      <td>1</td>\n",
       "      <td>Uprising</td>\n",
       "      <td>Uprising</td>\n",
       "      <td>Muse</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOAYATB12A6701FD50</td>\n",
       "      <td>1</td>\n",
       "      <td>Breakfast At Tiffany's</td>\n",
       "      <td>Home</td>\n",
       "      <td>Deep Blue Something</td>\n",
       "      <td>1993</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOBOAFP12A8C131F36</td>\n",
       "      <td>7</td>\n",
       "      <td>Lucky (Album Version)</td>\n",
       "      <td>We Sing.  We Dance.  We Steal Things.</td>\n",
       "      <td>Jason Mraz &amp; Colbie Caillat</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                       user                song  listen_count  \\\n",
       "0  d6589314c0a9bcbca4fee0c93b14bc402363afea  SOADQPP12A67020C82            12   \n",
       "1  d6589314c0a9bcbca4fee0c93b14bc402363afea  SOAFTRR12AF72A8D4D             1   \n",
       "2  d6589314c0a9bcbca4fee0c93b14bc402363afea  SOANQFY12AB0183239             1   \n",
       "3  d6589314c0a9bcbca4fee0c93b14bc402363afea  SOAYATB12A6701FD50             1   \n",
       "4  d6589314c0a9bcbca4fee0c93b14bc402363afea  SOBOAFP12A8C131F36             7   \n",
       "\n",
       "                           title                                release  \\\n",
       "0               You And Me Jesus                   Tribute To Jake Hess   \n",
       "1  Harder Better Faster Stronger                              Discovery   \n",
       "2                       Uprising                               Uprising   \n",
       "3         Breakfast At Tiffany's                                   Home   \n",
       "4          Lucky (Album Version)  We Sing.  We Dance.  We Steal Things.   \n",
       "\n",
       "                   artist_name  year  \n",
       "0                    Jake Hess  2004  \n",
       "1                    Daft Punk  2007  \n",
       "2                         Muse     0  \n",
       "3          Deep Blue Something  1993  \n",
       "4  Jason Mraz & Colbie Caillat     0  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('./output/triplet_dataset_sub_song_merged.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 10774558 entries, 0 to 10774557\n",
      "Data columns (total 7 columns):\n",
      "user            object\n",
      "song            object\n",
      "listen_count    int64\n",
      "title           object\n",
      "release         object\n",
      "artist_name     object\n",
      "year            int64\n",
      "dtypes: int64(2), object(5)\n",
      "memory usage: 575.4+ MB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 子集抽取\n",
    "要计算用户的item与所有3万首歌的相似度太慢，可考虑只推荐最流行的3000首歌"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 内存实在吃不消，奔溃了好几次，这里随机从3000首歌里取90"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "song_count_df = pd.read_csv('./output/song_playcount_df.csv')\n",
    "song_count_subset2 = song_count_df.head(n=3000)\n",
    "\n",
    "song_count_subset = song_count_subset2.sample(frac=0.03)\n",
    "# song_count_subset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>song</th>\n",
       "      <th>listen_count</th>\n",
       "      <th>title</th>\n",
       "      <th>release</th>\n",
       "      <th>artist_name</th>\n",
       "      <th>year</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOISNSU12AC468C0D8</td>\n",
       "      <td>6</td>\n",
       "      <td>If I Had You</td>\n",
       "      <td>For Your Entertainment (Deluxe Version)</td>\n",
       "      <td>Adam Lambert</td>\n",
       "      <td>2009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOOROCA12AF72A07D1</td>\n",
       "      <td>6</td>\n",
       "      <td>If I Ever Leave This World Alive</td>\n",
       "      <td>Music From The Motion Picture P.S. Ich liebe Dich</td>\n",
       "      <td>Flogging Molly</td>\n",
       "      <td>1997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOTFJGS12AB017F577</td>\n",
       "      <td>2</td>\n",
       "      <td>Speed Of Life</td>\n",
       "      <td>Twice The Speed Of Life</td>\n",
       "      <td>Sugarland</td>\n",
       "      <td>2004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>212</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOJHCOH12A8AE45F4F</td>\n",
       "      <td>11</td>\n",
       "      <td>Hypnopaedia</td>\n",
       "      <td>Identification Parade</td>\n",
       "      <td>Octopus Project</td>\n",
       "      <td>2002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>240</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOLAUOW12A8C13A400</td>\n",
       "      <td>1</td>\n",
       "      <td>Psychotic Girl</td>\n",
       "      <td>Attack &amp; Release</td>\n",
       "      <td>The Black Keys</td>\n",
       "      <td>2004</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         user                song  \\\n",
       "19   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOISNSU12AC468C0D8   \n",
       "31   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOOROCA12AF72A07D1   \n",
       "40   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOTFJGS12AB017F577   \n",
       "212  5a905f000fc1ff3df7ca807d57edb608863db05d  SOJHCOH12A8AE45F4F   \n",
       "240  5a905f000fc1ff3df7ca807d57edb608863db05d  SOLAUOW12A8C13A400   \n",
       "\n",
       "     listen_count                             title  \\\n",
       "19              6                      If I Had You   \n",
       "31              6  If I Ever Leave This World Alive   \n",
       "40              2                     Speed Of Life   \n",
       "212            11                       Hypnopaedia   \n",
       "240             1                    Psychotic Girl   \n",
       "\n",
       "                                               release      artist_name  year  \n",
       "19             For Your Entertainment (Deluxe Version)     Adam Lambert  2009  \n",
       "31   Music From The Motion Picture P.S. Ich liebe Dich   Flogging Molly  1997  \n",
       "40                             Twice The Speed Of Life        Sugarland  2004  \n",
       "212                              Identification Parade  Octopus Project  2002  \n",
       "240                                   Attack & Release   The Black Keys  2004  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "song_subset = list(song_count_subset.song)\n",
    "data_sub = data[data.song.isin(song_subset)]\n",
    "\n",
    "del data\n",
    "data_sub.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(122924, 7)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_sub.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "55.0\n"
     ]
    }
   ],
   "source": [
    "# # 将播放次数变换到[0,10]区间方便\n",
    "ulimit = np.percentile(data_sub.listen_count.values,99.12)\n",
    "print(ulimit)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_sub['listen_count'].loc[data_sub['listen_count']>ulimit]=ulimit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py:6499: MatplotlibDeprecationWarning: \n",
      "The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.\n",
      "  alternative=\"'density'\", removal=\"3.1\")\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1a18eb27b8>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(16, 8))\n",
    "sns.distplot(data_sub['listen_count'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>song</th>\n",
       "      <th>listen_count</th>\n",
       "      <th>title</th>\n",
       "      <th>release</th>\n",
       "      <th>artist_name</th>\n",
       "      <th>year</th>\n",
       "      <th>listen_count_group</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOISNSU12AC468C0D8</td>\n",
       "      <td>6.0</td>\n",
       "      <td>If I Had You</td>\n",
       "      <td>For Your Entertainment (Deluxe Version)</td>\n",
       "      <td>Adam Lambert</td>\n",
       "      <td>2009</td>\n",
       "      <td>(5, 10]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOOROCA12AF72A07D1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>If I Ever Leave This World Alive</td>\n",
       "      <td>Music From The Motion Picture P.S. Ich liebe Dich</td>\n",
       "      <td>Flogging Molly</td>\n",
       "      <td>1997</td>\n",
       "      <td>(5, 10]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOTFJGS12AB017F577</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Speed Of Life</td>\n",
       "      <td>Twice The Speed Of Life</td>\n",
       "      <td>Sugarland</td>\n",
       "      <td>2004</td>\n",
       "      <td>(0, 5]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>212</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOJHCOH12A8AE45F4F</td>\n",
       "      <td>11.0</td>\n",
       "      <td>Hypnopaedia</td>\n",
       "      <td>Identification Parade</td>\n",
       "      <td>Octopus Project</td>\n",
       "      <td>2002</td>\n",
       "      <td>(10, 15]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>240</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOLAUOW12A8C13A400</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Psychotic Girl</td>\n",
       "      <td>Attack &amp; Release</td>\n",
       "      <td>The Black Keys</td>\n",
       "      <td>2004</td>\n",
       "      <td>(0, 5]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>299</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOOHDXT12AB0181797</td>\n",
       "      <td>1.0</td>\n",
       "      <td>She\u0019s Long Gone</td>\n",
       "      <td>Brothers</td>\n",
       "      <td>The Black Keys</td>\n",
       "      <td>2010</td>\n",
       "      <td>(0, 5]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>482</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOZHUUI12A6701D7B6</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Swing_ Swing</td>\n",
       "      <td>The All-American Rejects</td>\n",
       "      <td>The All-American Rejects</td>\n",
       "      <td>2003</td>\n",
       "      <td>(0, 5]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>613</th>\n",
       "      <td>baf47ed8da24d607e50d8684cde78b923538640f</td>\n",
       "      <td>SOPCQRT12A8C13B15D</td>\n",
       "      <td>1.0</td>\n",
       "      <td>How It Ends (Album version)</td>\n",
       "      <td>How It Ends</td>\n",
       "      <td>Devotchka</td>\n",
       "      <td>2004</td>\n",
       "      <td>(0, 5]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>722</th>\n",
       "      <td>a58de017cbeda1763ea002fe027ed41b4ed53109</td>\n",
       "      <td>SOGPBAW12A6D4F9F22</td>\n",
       "      <td>3.0</td>\n",
       "      <td>Livin' On A Prayer</td>\n",
       "      <td>Cross Road</td>\n",
       "      <td>Bon Jovi</td>\n",
       "      <td>1986</td>\n",
       "      <td>(0, 5]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>738</th>\n",
       "      <td>a58de017cbeda1763ea002fe027ed41b4ed53109</td>\n",
       "      <td>SOISNSU12AC468C0D8</td>\n",
       "      <td>3.0</td>\n",
       "      <td>If I Had You</td>\n",
       "      <td>For Your Entertainment (Deluxe Version)</td>\n",
       "      <td>Adam Lambert</td>\n",
       "      <td>2009</td>\n",
       "      <td>(0, 5]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         user                song  \\\n",
       "19   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOISNSU12AC468C0D8   \n",
       "31   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOOROCA12AF72A07D1   \n",
       "40   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOTFJGS12AB017F577   \n",
       "212  5a905f000fc1ff3df7ca807d57edb608863db05d  SOJHCOH12A8AE45F4F   \n",
       "240  5a905f000fc1ff3df7ca807d57edb608863db05d  SOLAUOW12A8C13A400   \n",
       "299  5a905f000fc1ff3df7ca807d57edb608863db05d  SOOHDXT12AB0181797   \n",
       "482  5a905f000fc1ff3df7ca807d57edb608863db05d  SOZHUUI12A6701D7B6   \n",
       "613  baf47ed8da24d607e50d8684cde78b923538640f  SOPCQRT12A8C13B15D   \n",
       "722  a58de017cbeda1763ea002fe027ed41b4ed53109  SOGPBAW12A6D4F9F22   \n",
       "738  a58de017cbeda1763ea002fe027ed41b4ed53109  SOISNSU12AC468C0D8   \n",
       "\n",
       "     listen_count                             title  \\\n",
       "19            6.0                      If I Had You   \n",
       "31            6.0  If I Ever Leave This World Alive   \n",
       "40            2.0                     Speed Of Life   \n",
       "212          11.0                       Hypnopaedia   \n",
       "240           1.0                    Psychotic Girl   \n",
       "299           1.0                   She\u0019s Long Gone   \n",
       "482           1.0                      Swing_ Swing   \n",
       "613           1.0       How It Ends (Album version)   \n",
       "722           3.0                Livin' On A Prayer   \n",
       "738           3.0                      If I Had You   \n",
       "\n",
       "                                               release  \\\n",
       "19             For Your Entertainment (Deluxe Version)   \n",
       "31   Music From The Motion Picture P.S. Ich liebe Dich   \n",
       "40                             Twice The Speed Of Life   \n",
       "212                              Identification Parade   \n",
       "240                                   Attack & Release   \n",
       "299                                           Brothers   \n",
       "482                           The All-American Rejects   \n",
       "613                                        How It Ends   \n",
       "722                                         Cross Road   \n",
       "738            For Your Entertainment (Deluxe Version)   \n",
       "\n",
       "                  artist_name  year listen_count_group  \n",
       "19               Adam Lambert  2009            (5, 10]  \n",
       "31             Flogging Molly  1997            (5, 10]  \n",
       "40                  Sugarland  2004             (0, 5]  \n",
       "212           Octopus Project  2002           (10, 15]  \n",
       "240            The Black Keys  2004             (0, 5]  \n",
       "299            The Black Keys  2010             (0, 5]  \n",
       "482  The All-American Rejects  2003             (0, 5]  \n",
       "613                 Devotchka  2004             (0, 5]  \n",
       "722                  Bon Jovi  1986             (0, 5]  \n",
       "738              Adam Lambert  2009             (0, 5]  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### listen_count特征创建分组\n",
    "bin = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]\n",
    "data_sub['listen_count_group'] = pd.cut(data_sub['listen_count'], bin)\n",
    "data_sub.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>song</th>\n",
       "      <th>listen_count</th>\n",
       "      <th>title</th>\n",
       "      <th>release</th>\n",
       "      <th>artist_name</th>\n",
       "      <th>year</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOISNSU12AC468C0D8</td>\n",
       "      <td>1.0</td>\n",
       "      <td>If I Had You</td>\n",
       "      <td>For Your Entertainment (Deluxe Version)</td>\n",
       "      <td>Adam Lambert</td>\n",
       "      <td>2009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOOROCA12AF72A07D1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>If I Ever Leave This World Alive</td>\n",
       "      <td>Music From The Motion Picture P.S. Ich liebe Dich</td>\n",
       "      <td>Flogging Molly</td>\n",
       "      <td>1997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOTFJGS12AB017F577</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Speed Of Life</td>\n",
       "      <td>Twice The Speed Of Life</td>\n",
       "      <td>Sugarland</td>\n",
       "      <td>2004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>212</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOJHCOH12A8AE45F4F</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Hypnopaedia</td>\n",
       "      <td>Identification Parade</td>\n",
       "      <td>Octopus Project</td>\n",
       "      <td>2002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>240</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOLAUOW12A8C13A400</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Psychotic Girl</td>\n",
       "      <td>Attack &amp; Release</td>\n",
       "      <td>The Black Keys</td>\n",
       "      <td>2004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>299</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOOHDXT12AB0181797</td>\n",
       "      <td>0.0</td>\n",
       "      <td>She\u0019s Long Gone</td>\n",
       "      <td>Brothers</td>\n",
       "      <td>The Black Keys</td>\n",
       "      <td>2010</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>482</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOZHUUI12A6701D7B6</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Swing_ Swing</td>\n",
       "      <td>The All-American Rejects</td>\n",
       "      <td>The All-American Rejects</td>\n",
       "      <td>2003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>613</th>\n",
       "      <td>baf47ed8da24d607e50d8684cde78b923538640f</td>\n",
       "      <td>SOPCQRT12A8C13B15D</td>\n",
       "      <td>0.0</td>\n",
       "      <td>How It Ends (Album version)</td>\n",
       "      <td>How It Ends</td>\n",
       "      <td>Devotchka</td>\n",
       "      <td>2004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>722</th>\n",
       "      <td>a58de017cbeda1763ea002fe027ed41b4ed53109</td>\n",
       "      <td>SOGPBAW12A6D4F9F22</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Livin' On A Prayer</td>\n",
       "      <td>Cross Road</td>\n",
       "      <td>Bon Jovi</td>\n",
       "      <td>1986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>738</th>\n",
       "      <td>a58de017cbeda1763ea002fe027ed41b4ed53109</td>\n",
       "      <td>SOISNSU12AC468C0D8</td>\n",
       "      <td>0.0</td>\n",
       "      <td>If I Had You</td>\n",
       "      <td>For Your Entertainment (Deluxe Version)</td>\n",
       "      <td>Adam Lambert</td>\n",
       "      <td>2009</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         user                song  \\\n",
       "19   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOISNSU12AC468C0D8   \n",
       "31   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOOROCA12AF72A07D1   \n",
       "40   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOTFJGS12AB017F577   \n",
       "212  5a905f000fc1ff3df7ca807d57edb608863db05d  SOJHCOH12A8AE45F4F   \n",
       "240  5a905f000fc1ff3df7ca807d57edb608863db05d  SOLAUOW12A8C13A400   \n",
       "299  5a905f000fc1ff3df7ca807d57edb608863db05d  SOOHDXT12AB0181797   \n",
       "482  5a905f000fc1ff3df7ca807d57edb608863db05d  SOZHUUI12A6701D7B6   \n",
       "613  baf47ed8da24d607e50d8684cde78b923538640f  SOPCQRT12A8C13B15D   \n",
       "722  a58de017cbeda1763ea002fe027ed41b4ed53109  SOGPBAW12A6D4F9F22   \n",
       "738  a58de017cbeda1763ea002fe027ed41b4ed53109  SOISNSU12AC468C0D8   \n",
       "\n",
       "     listen_count                             title  \\\n",
       "19            1.0                      If I Had You   \n",
       "31            1.0  If I Ever Leave This World Alive   \n",
       "40            0.0                     Speed Of Life   \n",
       "212           2.0                       Hypnopaedia   \n",
       "240           0.0                    Psychotic Girl   \n",
       "299           0.0                   She\u0019s Long Gone   \n",
       "482           0.0                      Swing_ Swing   \n",
       "613           0.0       How It Ends (Album version)   \n",
       "722           0.0                Livin' On A Prayer   \n",
       "738           0.0                      If I Had You   \n",
       "\n",
       "                                               release  \\\n",
       "19             For Your Entertainment (Deluxe Version)   \n",
       "31   Music From The Motion Picture P.S. Ich liebe Dich   \n",
       "40                             Twice The Speed Of Life   \n",
       "212                              Identification Parade   \n",
       "240                                   Attack & Release   \n",
       "299                                           Brothers   \n",
       "482                           The All-American Rejects   \n",
       "613                                        How It Ends   \n",
       "722                                         Cross Road   \n",
       "738            For Your Entertainment (Deluxe Version)   \n",
       "\n",
       "                  artist_name  year  \n",
       "19               Adam Lambert  2009  \n",
       "31             Flogging Molly  1997  \n",
       "40                  Sugarland  2004  \n",
       "212           Octopus Project  2002  \n",
       "240            The Black Keys  2004  \n",
       "299            The Black Keys  2010  \n",
       "482  The All-American Rejects  2003  \n",
       "613                 Devotchka  2004  \n",
       "722                  Bon Jovi  1986  \n",
       "738              Adam Lambert  2009  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_sub.loc[data_sub['listen_count'] <= 5, 'listen_count'] = 0\n",
    "data_sub.loc[(data_sub['listen_count'] > 5) & (data_sub['listen_count'] <= 10), 'listen_count'] = 1\n",
    "data_sub.loc[(data_sub['listen_count'] > 10) & (data_sub['listen_count'] <= 15), 'listen_count'] = 2\n",
    "data_sub.loc[(data_sub['listen_count'] > 15) & (data_sub['listen_count'] <= 20), 'listen_count'] = 3\n",
    "data_sub.loc[(data_sub['listen_count'] > 20) & (data_sub['listen_count'] <= 25), 'listen_count'] = 4\n",
    "data_sub.loc[(data_sub['listen_count'] > 25) & (data_sub['listen_count'] <= 30), 'listen_count'] = 5\n",
    "data_sub.loc[(data_sub['listen_count'] > 30) & (data_sub['listen_count'] <= 35), 'listen_count'] = 6\n",
    "data_sub.loc[(data_sub['listen_count'] > 35) & (data_sub['listen_count'] <= 40), 'listen_count'] = 7\n",
    "data_sub.loc[(data_sub['listen_count'] > 40) & (data_sub['listen_count'] <= 45), 'listen_count'] = 8\n",
    "data_sub.loc[(data_sub['listen_count'] > 45) & (data_sub['listen_count'] <= 50), 'listen_count'] = 9\n",
    "data_sub.loc[data_sub['listen_count'] > 50, 'listen_count'] = 10\n",
    "\n",
    "data_sub = data_sub.drop('listen_count_group', axis=1)\n",
    "data_sub.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>song</th>\n",
       "      <th>listen_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOISNSU12AC468C0D8</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOOROCA12AF72A07D1</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>d6589314c0a9bcbca4fee0c93b14bc402363afea</td>\n",
       "      <td>SOTFJGS12AB017F577</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>212</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOJHCOH12A8AE45F4F</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>240</th>\n",
       "      <td>5a905f000fc1ff3df7ca807d57edb608863db05d</td>\n",
       "      <td>SOLAUOW12A8C13A400</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         user                song  \\\n",
       "19   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOISNSU12AC468C0D8   \n",
       "31   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOOROCA12AF72A07D1   \n",
       "40   d6589314c0a9bcbca4fee0c93b14bc402363afea  SOTFJGS12AB017F577   \n",
       "212  5a905f000fc1ff3df7ca807d57edb608863db05d  SOJHCOH12A8AE45F4F   \n",
       "240  5a905f000fc1ff3df7ca807d57edb608863db05d  SOLAUOW12A8C13A400   \n",
       "\n",
       "     listen_count  \n",
       "19            1.0  \n",
       "31            1.0  \n",
       "40            0.0  \n",
       "212           2.0  \n",
       "240           0.0  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_sub = data_sub.drop(['title', 'release', 'artist_name', 'year'], axis=1)\n",
    "data_sub.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Recommendation Engines"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>song</th>\n",
       "      <th>listen_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2586132</th>\n",
       "      <td>7b40c30f4e01b2b5c91c0048ad7eaa7ab3439a1d</td>\n",
       "      <td>SOIZFIO12A6310DBBE</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2522250</th>\n",
       "      <td>452c96717f51da033ed0fd557e1d093172c22c8f</td>\n",
       "      <td>SOXHIDK12A58A7CFB3</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9200514</th>\n",
       "      <td>b2ff779f72141806d4cfdbf9b441656447c59c75</td>\n",
       "      <td>SONTIBS12A6D4F9CFE</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3888259</th>\n",
       "      <td>ac33efaec446bfb0e08890a105de4986be40de48</td>\n",
       "      <td>SOBOUPA12A6D4F81F1</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8163972</th>\n",
       "      <td>15fe4db87b410d78d7da848da2ab06c7149cf883</td>\n",
       "      <td>SOJHCOH12A8AE45F4F</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                             user                song  \\\n",
       "2586132  7b40c30f4e01b2b5c91c0048ad7eaa7ab3439a1d  SOIZFIO12A6310DBBE   \n",
       "2522250  452c96717f51da033ed0fd557e1d093172c22c8f  SOXHIDK12A58A7CFB3   \n",
       "9200514  b2ff779f72141806d4cfdbf9b441656447c59c75  SONTIBS12A6D4F9CFE   \n",
       "3888259  ac33efaec446bfb0e08890a105de4986be40de48  SOBOUPA12A6D4F81F1   \n",
       "8163972  15fe4db87b410d78d7da848da2ab06c7149cf883  SOJHCOH12A8AE45F4F   \n",
       "\n",
       "         listen_count  \n",
       "2586132           0.0  \n",
       "2522250           2.0  \n",
       "9200514           0.0  \n",
       "3888259           0.0  \n",
       "8163972           0.0  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "train, test = train_test_split(data_sub, test_size = 0.40, random_state=0)\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(122924, 3)\n",
      "(73754, 3)\n",
      "(49170, 3)\n"
     ]
    }
   ],
   "source": [
    "train.to_csv('./output/train_item.csv', index=False, header=False)\n",
    "test.to_csv('./output/test_item.csv', index=False, header=False)\n",
    "data_sub.to_csv('./output/data_item.csv', index=False, header=False)\n",
    "\n",
    "print(data_sub.shape)\n",
    "print(train.shape)\n",
    "print(test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里取test_item.csv文件，data_item.csv、train.csv还是扛不住"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 实现基于物品的协同过滤"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# from Item_CF_Recommender import item_cf_recommender\n",
    "# item_recommender = item_cf_recommender()\n",
    "# item_recommender.fit(train, 'song','listen_count')\n",
    "\n",
    "# #对测试集中每个用户产生歌曲推荐\n",
    "# #user = test.iat[0,0]\n",
    "# user = list(test.user)[1]\n",
    "# # song = list(test.song)[0]\n",
    "# recommendations = item_recommender.predict(user)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from surprise import KNNBasic\n",
    "from surprise import Dataset\n",
    "from surprise import Reader\n",
    "from surprise import accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "file_path = './output/test_item.csv'\n",
    "reader = Reader(line_format='user item rating', sep=',')\n",
    "data = Dataset.load_from_file(file_path, reader=reader)\n",
    "data.split(n_folds=3)\n",
    "dataset = data.build_full_trainset()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "90\n",
      "36133\n"
     ]
    }
   ],
   "source": [
    "print(dataset.n_items)\n",
    "print(dataset.n_users)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimating biases using als...\n",
      "Computing the pearson_baseline similarity matrix...\n",
      "Done computing similarity matrix.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<surprise.prediction_algorithms.knns.KNNBasic at 0x10b37e1d0>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sim_options = {'name': 'pearson_baseline', 'user_bases': False}\n",
    "algo = KNNBasic(sim_options=sim_options)\n",
    "algo.fit(dataset)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 找到最近的20首歌曲"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import io\n",
    "\n",
    "def read_data_items():\n",
    "    file_name = './output/test_item.csv'\n",
    "    uid_to_song = {}\n",
    "    song_to_uid = {}\n",
    "    with io.open(file_name, 'r') as f:\n",
    "        for line in f:\n",
    "            line = line.split(',')\n",
    "            uid_to_song[line[0]] = line[1]\n",
    "            song_to_uid[line[1]] = line[0]\n",
    "    return uid_to_song, song_to_uid\n",
    "\n",
    "uid_to_song, song_to_uid = read_data_items()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'SOGPBAW12A6D4F9F22': '8e534eeba0aef8a6413a6a0f5adb80a6f9de6dc4',\n",
       " 'SOITFCH12A6D4F9478': 'ebc2091c54ace128fb78c543f29a8fad9c42bbe5',\n",
       " 'SOKUFKO12AB017F75F': '9ed27a71127572f3c64af6b88b10a1631ca5ffad',\n",
       " 'SOZQSVB12A8C13C271': '492724d7a1874a770140698abf200baca1d73ae1',\n",
       " 'SOXERNH12A67AD8642': '2bbfa1a8f23e271dacf6c217aed2b8262b5b6041',\n",
       " 'SOXBRKW12A8C142084': 'd9be7fb6f23f396697bc4180b6d8e7ff1e7aba4c',\n",
       " 'SOANSPC12A6702154A': '86cd346a262a233b924902421340f7529c4e93f4',\n",
       " 'SOBEZLE12A6D4F7D0A': 'f46d1e78c54ada12e8966bac7d9b7bae4830219b',\n",
       " 'SOBBKGF12A8C1311EE': '03a0c48fe77feb59bd678655a82729bd43c4cad4',\n",
       " 'SOJHCOH12A8AE45F4F': '846fce32b0e9661562729b2fb1271758cfb10d34',\n",
       " 'SOICRPT12A8C13190A': '3dc0f10cfd97b8e2902d2a8fe77b3579279cfcc0',\n",
       " 'SOJSGZT12A58A7E75C': 'a83039382e1b3fc58e9b98185553466fe9256f85',\n",
       " 'SOAMIQK12A6701D94F': '86343a35e4bca28243694759de4c972b4ac1ccda',\n",
       " 'SOYSWHI12AAA8C5BFD': 'e16f984850bae621ccefe18e393c31489d3c5a76',\n",
       " 'SOYABSZ12A81C1FEAC': '3692a67cf5b87016956ff407551a3dddb104b83e',\n",
       " 'SOISNSU12AC468C0D8': '0054aeefe85c69a3f7ef143db7da1bca30d72495',\n",
       " 'SOYKKZP12A6D4F78D0': '0ef9fe0bf8d720063a0a981f1c2581a61718b152',\n",
       " 'SOFTWWH12AB017AD0E': 'fb4a95154a7a04d8d6b490b50f16953f3598900c',\n",
       " 'SOCBQKE12AB018548E': 'e7cd37f2a0296925c9fc472d12da66e0c4e4851b',\n",
       " 'SOCRVWC12A6310F991': '4696aefb769098b5426a2c038caac11d7bbf55f6',\n",
       " 'SOBKLTU12A58A7FB77': 'e2dc1a1fa04244fac1bc2e094d4b705c603d2df1',\n",
       " 'SOBOUPA12A6D4F81F1': 'ac213d7400de253b3bfdc8311d6626c06996f126',\n",
       " 'SOUMSSX12AB0182F29': '798af4bc505500865c0cde9effd425ab9454bca9',\n",
       " 'SORWEEW12A58A7A935': '8dcfcef8e50857dbaea153236335972551b84a98',\n",
       " 'SOUCPUM12A81C20BC5': '044edfb45ea0000a1dd4e020b973f5272c3c4c36',\n",
       " 'SOCHWPT12AB0184F15': '52db19cbf02e08e8a4ea70c585dbc440702834d5',\n",
       " 'SOKAESA12A8C1410A1': '49dbd4ca89a5b0e7ecbc61c7638fcb88efc0d8b4',\n",
       " 'SOPGOJB12A8C13B05C': '45ee8860569c5e9635788fc3394cb59e2025cebf',\n",
       " 'SODPPDY12AB017F767': 'a6c2d9c41d2f7a9744ec4da09478be58f294f36e',\n",
       " 'SOQHOUQ12A6D4F8DA9': '63a3fce1e60eafb813dff679ebc72beda32afcfa',\n",
       " 'SOTNEEA12A6D4F7F8D': 'ac3475dc4171d2ab27c46aa940e61d316f501650',\n",
       " 'SOHWXEU12A8C1320D1': 'c1c42ef3eeabe09d9e9d7f751b6b422f97f3ae17',\n",
       " 'SOUYPYF12A58A76897': 'f0627810e8aa99f40ddbbdd163806d8d0cb4583b',\n",
       " 'SORCEQI12A8C1440BD': 'c464e4e5707f8bad302fac34d094f6259474af27',\n",
       " 'SOZHUUI12A6701D7B6': '9c2dfee26bbdd4fb19e9800244bea6e7181caeae',\n",
       " 'SOEAIVD12B34F33062': '185c36d940461545c92171081454838482e548dd',\n",
       " 'SOWBTPS12A6D4FA5BE': 'ddc4b48eb23724f3288d0152223cdcc328c02aed',\n",
       " 'SOMHTUR12A6D4F8764': '092cf29ea2311c17fcb73a56e0ec9fb5a7bc41ee',\n",
       " 'SOLAUOW12A8C13A400': 'e3a56acb8203834c98652d8d2d6e361a397d7ad3',\n",
       " 'SOSMXVH12A58A7CA6C': '773fa53bf86216c0f3c03dfb62c6cbfeb9ec90c5',\n",
       " 'SOBMKJU12A6D4F7128': 'd0c1a62a3e682c1df163e2d9ca98eca32e71fa3c',\n",
       " 'SOKZZGT12A67ADA4C3': 'a34fa32598e326e5dad563d3f4218da7f25997fc',\n",
       " 'SORWLJM12A6D4F9C0C': '1e0c5e4209a156d0bf77eaf52341e24a73aafc57',\n",
       " 'SOOHDXT12AB0181797': '773fa53bf86216c0f3c03dfb62c6cbfeb9ec90c5',\n",
       " 'SOIDEPI12A6D4F98D2': 'fa172cebd94c7904d1dbe9a8601bd7e66478661d',\n",
       " 'SOVXSZO12A8C13FD2C': '4b6967219af72f28d77c2da1e74b5d1b036bb0bd',\n",
       " 'SOTJSCD12A8C14093B': 'aaa3cccacdaba18ad131981acd4acbba25113f77',\n",
       " 'SOHFKGU12AB01819F3': '1d04a4f845e6028b133cdb00afac4ab9c0bf422e',\n",
       " 'SOBBGTM12A6D4F6199': 'b868017a32851353a0563630f3673643be7e0434',\n",
       " 'SONIPQC12AB017B595': '296a8abbd0c7890956b8ad1c4b59f6da23dace3e',\n",
       " 'SOPCQRT12A8C13B15D': '3e872cf0e32da1ea7008a3ffccc4ce9307137732',\n",
       " 'SOXEDZH12A8C137D06': 'fe8694e4432314f835630d1b7dd3ee97eddd8931',\n",
       " 'SOXHIDK12A58A7CFB3': '67a0a8856873ec921677c417d381f1721e986115',\n",
       " 'SOVYIYI12A8C138D88': '69ed9e54171814a24368657b538b89cebe0be70c',\n",
       " 'SOOROCA12AF72A07D1': '8c0bac48e282c53611e6c03294a84a9ea8ec08ae',\n",
       " 'SORWBEB12A58A78BF8': '31f6c9287aa6edb77d68d34f919edb3aadaeafc0',\n",
       " 'SOJEHJV12A6D223C0C': '9af224ac155313fa4348c1d1bd2bdaf5b631e9b0',\n",
       " 'SOEWPZY12A6D4FB168': '079c9b2fc16e3f913d483290eff200cf72f9c336',\n",
       " 'SORJNMJ12A8C13D994': 'f87957de6c891254eba5b38ecc06acc5b56f6d42',\n",
       " 'SOVWHPM12AB017DABB': '131198ec82e65c99c298731e9f5ab67044920f04',\n",
       " 'SOPUSNZ12A6D4F9684': '7e7065fdc10066eba702f1edfd4a847bc08c4f28',\n",
       " 'SOUKLPY12A8C1451A8': '2e73636bcc122d08b85afb3fbd59bd67efb520bc',\n",
       " 'SOHWRJH12A8C139AFC': '912b1b54a9d86c23b10fb47ea02a8fe322d2bd8c',\n",
       " 'SOFEJPJ12A8C145455': '5e47726214d8bdcdc30df836042e5c6360c06050',\n",
       " 'SOCQOZB12AB0185685': '8a0773a56329d4eaeace35f3d9b4ba12aefc4b65',\n",
       " 'SOPFOEP12A6D4F6C3D': 'fea0fd9f7f64682418c78d32e93f185b8b173c40',\n",
       " 'SOIZFIO12A6310DBBE': 'c27b325ef834bd2aa5d94a7563909a1121a01405',\n",
       " 'SODYAQG12A6D4FD15C': '8ff326e2868e5a93c74c27450da7666ac9a966ca',\n",
       " 'SOSUGSC12A6D4FB0C4': '1ee1e7c9e5719b9fb42d0a3e1570f951261c9227',\n",
       " 'SOTFJGS12AB017F577': 'fe96f39ab91ed9a9dd0b1a6c1f565e3e9cb85d4d',\n",
       " 'SOHZDYL12A8C141C73': 'e2a3b158b60ad9dddcc99d26a8b9616dcf4868fc',\n",
       " 'SOXNZUH12AB018393F': '12e0a0370fa51dc2b176f92080a8543376b0468c',\n",
       " 'SOUBKFT12A6701F07A': 'fb94bee2c7a3fb0efa93e164f8907b88dbdf9606',\n",
       " 'SOIZYSO12A58A7BA28': '6cb507108fcfa89061a0c8d11701c4f968b377b5',\n",
       " 'SOSGEGU12AB018188A': 'bc55575593e4b384a6e17d5bd5c2a91a652bdbec',\n",
       " 'SONTIBS12A6D4F9CFE': '61063d0c8d3db62d4f621bff7ef54cf9f3ea0b25',\n",
       " 'SOCHKWF12A58A7C9B7': '5dc402bd7f28054439006c05b3e3c8a64f6c9858',\n",
       " 'SOPEFDW12AF72A1709': 'a23e684dcb9b3a3356be1d97d399c1f329761d88',\n",
       " 'SODCNEE12A6310E037': '5ce0043d4706f0ce65613f7609dcc6912ca16759',\n",
       " 'SOXHYVQ12AB0187949': '1894319ee28fbea8ec7be377c0cbf00d8d9e12ca',\n",
       " 'SOYXAUC12A8AE453A0': 'cf68224ae5611d8b2df393be4e07a04a8eb599de',\n",
       " 'SOYKFFK12A8C14391D': '9d2d4f5fe84c82cf42dd451cbb071a10e9ff21cb',\n",
       " 'SOCPIVV12A6D4F7B4C': '5e7a77b667f7964ccd35697d9052e0a6f9079d99',\n",
       " 'SOCMNRG12AB0189D3F': 'd006ce54d7eaf0dfd865d075df48ac9afbae2179',\n",
       " 'SONUSON12AB0184325': '9840db6ba971da364584fda0410760c7172031ac',\n",
       " 'SOQXDXM12A8C134E8E': '1aa0e55e37ea8f94c62080d4a80398f4873bb7ae',\n",
       " 'SOYBLYP12A58A79D32': '979999aaab814e79c83d746f89090264fe7154a1',\n",
       " 'SOYWENS12AB0180B01': '27844eb2fd51260ec756f89f84fbab8b763002bc',\n",
       " 'SOOEQXL12AAF3B4D73': 'e51f2204aa65b9b60d01af15c34d160a0e0a5d9e',\n",
       " 'SOPMVRA12AB01872D6': 'c05e6cf28167818ea980d93fa448771acf477ede'}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "song_to_uid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'d9fa84344937e67dbd58c6dd667fcf440d2e9b8f': 'SOISNSU12AC468C0D8',\n",
       " 'cb70499ad7094959d0f4eec8305fa5f80bd990b6': 'SOITFCH12A6D4F9478',\n",
       " '5a10ef3b1929813d32509215970040c70be4fc22': 'SODPPDY12AB017F767',\n",
       " '7de4388c64742657d20e4fdcfac46fddd93f2d6f': 'SOZQSVB12A8C13C271',\n",
       " '77c2c4342a930a6f9d8c9135382547a400714bf0': 'SOXERNH12A67AD8642',\n",
       " '5fb2630c42e4a08f4f5456306d547a1de3c60100': 'SOANSPC12A6702154A',\n",
       " 'f6d78516f331c684ee611e07effcb796e94ae456': 'SOYKFFK12A8C14391D',\n",
       " '0a41aef79aee9f79ace964d373895c7aacf4f7e9': 'SOBEZLE12A6D4F7D0A',\n",
       " '35bcc83729af09a84c39b9e3f22d8aa18cbc1f46': 'SOBBKGF12A8C1311EE',\n",
       " '10ebc02c7998d7809a6b55a4af6fb6e4e9ec1dab': 'SOITFCH12A6D4F9478',\n",
       " '7d9545780cac8671929a9def43436dc7808d6ecf': 'SOICRPT12A8C13190A',\n",
       " 'ebd1da63cb75965284e6a3edea61b9c0af4bf91f': 'SOJSGZT12A58A7E75C',\n",
       " 'bc9c92389cd3d325e51afae7e867389340d8bbec': 'SOAMIQK12A6701D94F',\n",
       " 'db1b34ebb6b2e1cbebe8c8feb9952405f5bc10d4': 'SOISNSU12AC468C0D8',\n",
       " '5e2c1f34b585e58d63fec8daff877a5aa864174c': 'SOISNSU12AC468C0D8',\n",
       " 'd65735671098165afb1353db9b50231d092c8d57': 'SOJSGZT12A58A7E75C',\n",
       " 'b959554c3778c93542c73f1391193ffea408ccd9': 'SOBOUPA12A6D4F81F1',\n",
       " 'a559e10e890979d6d7dc91a918429454660e4886': 'SOFTWWH12AB017AD0E',\n",
       " 'b1a79e150d0dfc2e12fdd05396dc19118dac64e9': 'SOYSWHI12AAA8C5BFD',\n",
       " '7c22575523e181239132f840b51b26ef31e54596': 'SOSGEGU12AB018188A',\n",
       " '171bb11d180f822dadb2aae8c4ad2871057f7de2': 'SOBKLTU12A58A7FB77',\n",
       " '8012055de275704a05de361490bda4bf7982448e': 'SOAMIQK12A6701D94F',\n",
       " '2f1d30ce70bcba5b5880a586f45ba352e3693afd': 'SOBOUPA12A6D4F81F1',\n",
       " '0daf7bc8829b3c59f23437a4727750573a2dca9d': 'SOUMSSX12AB0182F29',\n",
       " '9c874467a5fb384f0d98656089f6587837dfbe7a': 'SORWEEW12A58A7A935',\n",
       " '4a25d0f270251013bfd2dc836b9767c78c92f04f': 'SOGPBAW12A6D4F9F22',\n",
       " '48f39e43e60e573f0deb461b00a18b429988f86d': 'SORCEQI12A8C1440BD',\n",
       " '56cb0a7abdbb00c9d74e955c9836086438e55bf5': 'SOISNSU12AC468C0D8',\n",
       " 'c56b1a7564b43d15263e2c190475a130a343d94b': 'SOJHCOH12A8AE45F4F',\n",
       " 'fb9e1a67c5762988215210180390c068736e94af': 'SOXERNH12A67AD8642',\n",
       " 'bb8142f7aa17e0723fb253127cbca82f9ae68fe0': 'SOKAESA12A8C1410A1',\n",
       " '5b1f943ffffcc77321906c185143dc55d57d8ffa': 'SOVWHPM12AB017DABB',\n",
       " 'f9daa0e8043b6754bd4704f877857db433ddc22e': 'SOKUFKO12AB017F75F',\n",
       " '07a40ee3143dd015dd2a6e8443672d2624e03510': 'SOHWXEU12A8C1320D1',\n",
       " '6662d9c12a9cdb159219891a192ec2cea63d6c70': 'SOTNEEA12A6D4F7F8D',\n",
       " 'd37b0be50befd02c40a4a7db690ad3ab982f2a93': 'SOBKLTU12A58A7FB77',\n",
       " 'c94eba09048d94f293bbea352b32cc44470985e1': 'SOBOUPA12A6D4F81F1',\n",
       " 'af436f1bd241c0342e5515c2e470b9f19fb8a3ae': 'SOJHCOH12A8AE45F4F',\n",
       " '227acb8c535e0b211922814a33c45cce90e48d41': 'SOITFCH12A6D4F9478',\n",
       " '8f0ca3f0a89f2a38509f1060c09e81babf43c53e': 'SOFTWWH12AB017AD0E',\n",
       " 'e641c77c87cf453d3fdc065a3935b00069a49a2f': 'SOBOUPA12A6D4F81F1',\n",
       " '394ac7516191b533d39835e3060e324c1904bfa5': 'SOHWXEU12A8C1320D1',\n",
       " '24c6e31beb3ffc9aaf33dfd3c80bd24a5f9c0095': 'SOYABSZ12A81C1FEAC',\n",
       " '96915640b3bccaa034a0614701281a7f7681f2cc': 'SOUYPYF12A58A76897',\n",
       " 'fd490a608a6d667facbd4db34429598fe24d6997': 'SORCEQI12A8C1440BD',\n",
       " 'f58737151a86c08912f8bc2c5e167ec772dc3f1b': 'SOBKLTU12A58A7FB77',\n",
       " '92cbbc63e82d0d729aecb2e75ef6f82587fefc01': 'SOBBKGF12A8C1311EE',\n",
       " '09ef275a80427a83c58963a460df06b540312bb9': 'SOWBTPS12A6D4FA5BE',\n",
       " 'b31eb2868ad7a37deb6e6057402b95779391b6ef': 'SOCHWPT12AB0184F15',\n",
       " '4471f9d68d7e4443498c0d94bb89acb832918150': 'SOMHTUR12A6D4F8764',\n",
       " '39fc66ab200382618db85ee91ca10f1e3831f49e': 'SOLAUOW12A8C13A400',\n",
       " '0ebe9d8735b309e265c5722e86ed1450d29352b7': 'SOHZDYL12A8C141C73',\n",
       " '629107c96c9f5dadea0f8704b43037557d1d05f1': 'SOBOUPA12A6D4F81F1',\n",
       " '1717b6b4be2d501690d5fa0237a1bd6182012877': 'SOITFCH12A6D4F9478',\n",
       " '1eff3d36509de4bc7685b5fdcf56fdfbe5fb99bf': 'SOTNEEA12A6D4F7F8D',\n",
       " '363182b69084f7021582994fe81d85c1596f8471': 'SOKZZGT12A67ADA4C3',\n",
       " '451e646e6d5f5471672665c9080b7e5bae5b7ca7': 'SOKZZGT12A67ADA4C3',\n",
       " '73d5eedea097e532cfd250193dca463fe17b2ef8': 'SOGPBAW12A6D4F9F22',\n",
       " '48ebade5861203f0543c366228813a58544c3124': 'SOIZFIO12A6310DBBE',\n",
       " '81e5b601034bf00c60c60f1fe80f93688945e6ad': 'SOISNSU12AC468C0D8',\n",
       " 'ffe3a49f6547941261469443d072577c45f62131': 'SORCEQI12A8C1440BD',\n",
       " '3a7d0893b1a58aa67f114caaf2a58b4fe5e38e71': 'SODPPDY12AB017F767',\n",
       " '26228407f1e51e2b55d08d4ac8b51268c29a80f8': 'SOBOUPA12A6D4F81F1',\n",
       " 'fdd9596107e4a68210173a656447a600d230d945': 'SOHFKGU12AB01819F3',\n",
       " 'a7cc79ab843d7126d4deaacb1c6b50ee59193e83': 'SOBOUPA12A6D4F81F1',\n",
       " '12ac1dce4e02f3d686708682c66aae9a79012e16': 'SOYABSZ12A81C1FEAC',\n",
       " '6bac79647bcde2a159b72d69994daa0aa43e1bfe': 'SOVXSZO12A8C13FD2C',\n",
       " '692fbecf9fcb68a4057469f6213d862d6e76a3cb': 'SOBBKGF12A8C1311EE',\n",
       " 'ee38642ca8f57df2aa7bf1ca4e2b29e7433dbe6a': 'SOCBQKE12AB018548E',\n",
       " '0d481a3d26988177aa738cf90d1aaa2d9a2df998': 'SOBOUPA12A6D4F81F1',\n",
       " 'f0429036c488b14d98d3d3dac9e43d7acf17d2f6': 'SOGPBAW12A6D4F9F22',\n",
       " '16c9ca16e2f6af7ae4aafe9684e1c6a97a3a92d0': 'SOTJSCD12A8C14093B',\n",
       " '68f9a674d7eb4fde7c975e1f939c31a3c2aba463': 'SOBMKJU12A6D4F7128',\n",
       " '46384b04a02e4a097068bba7943d30217007acea': 'SOZHUUI12A6701D7B6',\n",
       " 'c9f27b716c74d0c1fb9d01de748e7caafff6c379': 'SOKAESA12A8C1410A1',\n",
       " '35d6ba1913f9d88d146ce9df34e83aaf1f76880a': 'SOTFJGS12AB017F577',\n",
       " '9244866a4e82090e2cd057cbcd8946969c1f585f': 'SOBOUPA12A6D4F81F1',\n",
       " '93e39865dad6d77d65a19e0f63821b80372be552': 'SOHFKGU12AB01819F3',\n",
       " '889d9b3e07366542cf97feda32e1013c71b65fc1': 'SOLAUOW12A8C13A400',\n",
       " '3d0b16f977a21be16b44ea0478151b38a1f97b41': 'SOLAUOW12A8C13A400',\n",
       " '2705beb39178bbc7b7a37aff712efd31bc695b56': 'SOBMKJU12A6D4F7128',\n",
       " 'c82bfdf514793914caeef397ee01ee275fa69e3e': 'SOXHYVQ12AB0187949',\n",
       " '0fad208dab2160b18d96883d96ca9283d2c9c8f2': 'SOISNSU12AC468C0D8',\n",
       " 'ed5ad6131ed04b2feddf96436793503a6fe7beba': 'SOEWPZY12A6D4FB168',\n",
       " '291b91b2b601c3db8125eeac6814a93515881768': 'SOISNSU12AC468C0D8',\n",
       " 'c34fe79529acacb94a9f91ee8e0372169cad751e': 'SOXERNH12A67AD8642',\n",
       " 'e78bce2c6fe3039ce909aed29c3e65ef0b75521a': 'SOPCQRT12A8C13B15D',\n",
       " '6d1fcea562afd17a22f0f207535ad6b086a9fd6f': 'SOBMKJU12A6D4F7128',\n",
       " 'baccd1ab9864968142f28c0ca9578d0bfca8da70': 'SORWEEW12A58A7A935',\n",
       " 'c67af7ad6ec382fa35f6ea7ddf760a5284aacca4': 'SOXHIDK12A58A7CFB3',\n",
       " '6d8c244ba5f3e32bfa7a51fd2a9e39177be315e2': 'SOVYIYI12A8C138D88',\n",
       " 'da0cae087d6ddd4032e2b5884582cb7dde3f38f0': 'SOISNSU12AC468C0D8',\n",
       " 'e5e1e96974008a2b1f0016f4538e41683e2c0646': 'SOJHCOH12A8AE45F4F',\n",
       " 'fae18e24f17d98ec2354847fcb9bed4bc886240e': 'SOOROCA12AF72A07D1',\n",
       " '4517ec308f016184a51f2f7b88dff0a0f94fcae1': 'SOLAUOW12A8C13A400',\n",
       " 'd48e73a5acadb06b06702dd22619f180ec98d2ba': 'SOUYPYF12A58A76897',\n",
       " '7a0f312215198b46f16bfe0d301457e5817c0e7f': 'SOISNSU12AC468C0D8',\n",
       " 'dbe265e109e55445742bba502cb61e49c5e52d17': 'SOGPBAW12A6D4F9F22',\n",
       " '7e1110bd74163b350b84b5184aff3d6e6262c129': 'SOGPBAW12A6D4F9F22',\n",
       " 'fb95b36992c7902ff46c183e89b9a8573d1fcadc': 'SOKZZGT12A67ADA4C3',\n",
       " '6f6af654febc297c93fa3151492140bf18984dcf': 'SOWBTPS12A6D4FA5BE',\n",
       " 'c677c6b37f07e768524f4977103d14a46a88a098': 'SOFTWWH12AB017AD0E',\n",
       " '3a1e578d878ad1fcf55229ad2c870eeda41aa033': 'SOHWRJH12A8C139AFC',\n",
       " '7acae4a29751b9cfe387c018a96d1cc0fdc2347a': 'SOAMIQK12A6701D94F',\n",
       " '10ea35d0002de20f40b41a8cfad7495b009de8a7': 'SOVWHPM12AB017DABB',\n",
       " '51a67edac72a332dcc0a4d5060e90e10799d52ff': 'SOBOUPA12A6D4F81F1',\n",
       " '1fc63f2eb3d8c8101175797c80f12ee1388a3628': 'SOIDEPI12A6D4F98D2',\n",
       " 'bc57b5eecf7564f5bdf93696a3b2a0393599184c': 'SOBOUPA12A6D4F81F1',\n",
       " '5fe62fc0cf262e7a56f35bfa324fde92112b7d7d': 'SOCRVWC12A6310F991',\n",
       " '6d85cda172c5e94ada6cfa0e54d858f9ec2a3159': 'SOXHIDK12A58A7CFB3',\n",
       " 'cc6e0aa400bfe6024f6f27813bf2d7db525b4d8a': 'SORJNMJ12A8C13D994',\n",
       " '66855f87a57f3e765ab635a2c5d96e38b7eacd19': 'SOKUFKO12AB017F75F',\n",
       " 'fbe781c63192f0f6e8cb933d9ed0069fa99dda6c': 'SOCMNRG12AB0189D3F',\n",
       " 'e9e97c9185f79ffff2e9e2fd60ed83d47405eb09': 'SOVWHPM12AB017DABB',\n",
       " '1dbb700d60f6498580159023a93cfdcff2e76a9b': 'SOZHUUI12A6701D7B6',\n",
       " 'cf7f3381230f1f1dce1ff6345fe55005fcfd7f1a': 'SOUBKFT12A6701F07A',\n",
       " '3ee3a9925a31861e878297834fc81ebc63de23cd': 'SOLAUOW12A8C13A400',\n",
       " '1d77c6bfc85b43bfa37280870eeb6c49f77278d6': 'SOPUSNZ12A6D4F9684',\n",
       " 'f192a6a9e2924625052fe080eced121e79b3ac3a': 'SOIZYSO12A58A7BA28',\n",
       " '6108683df6af293d3129995b36f5c7a21e240410': 'SOISNSU12AC468C0D8',\n",
       " 'c158d35c58abdc3013f8b4ec0096503ca984861f': 'SOBOUPA12A6D4F81F1',\n",
       " 'cf58ac224aa068aba2e6cad79e7edc88dd02a829': 'SOBOUPA12A6D4F81F1',\n",
       " 'ad79335e9ab4a524080c9a7ce7351c3ca95654f6': 'SOKZZGT12A67ADA4C3',\n",
       " 'ef25eb77dc6f56a80651f9c20848f019895fa7d7': 'SOHWXEU12A8C1320D1',\n",
       " '47caf444799c5adc68afc648b1a904c2b2e990a7': 'SOISNSU12AC468C0D8',\n",
       " '6968c412ccd247eb383129803054ba185fde91a3': 'SOAMIQK12A6701D94F',\n",
       " 'bcd4b8d9c294e5dca8cca318fbbff4f0268424ae': 'SOAMIQK12A6701D94F',\n",
       " 'd618e7bcd12d37195ccde8d5f649495baab61c32': 'SOKAESA12A8C1410A1',\n",
       " '1cb73c530e25f5055c2982a175b5fd03014f7c54': 'SOISNSU12AC468C0D8',\n",
       " '37d61b5f6594b9f175c2fdf22f511288b0d705a0': 'SOYKFFK12A8C14391D',\n",
       " 'd9f79fbab060895bf5b96a332b704077f07e8137': 'SOZQSVB12A8C13C271',\n",
       " 'fa17ad36e5a9842201636aab8329d05e190771c1': 'SOKUFKO12AB017F75F',\n",
       " '363e0be6d38e643b7de12244b4e2d99e110343aa': 'SOLAUOW12A8C13A400',\n",
       " '8604a64033a1bf47f246436a2b17e39ccc9d3350': 'SOFEJPJ12A8C145455',\n",
       " '04e2725832637e073fd07ea51aaf8efd9085987f': 'SOBOUPA12A6D4F81F1',\n",
       " 'ee30adb69990e9008b456105b91889326b2eafd3': 'SOKAESA12A8C1410A1',\n",
       " '6d3e8f0460537893b1a78557d0ec4dc75e2b96f5': 'SOCBQKE12AB018548E',\n",
       " '1962a10a8fa195e4458cb16d999281cb9020e95e': 'SOBOUPA12A6D4F81F1',\n",
       " 'f81603fd4106ce85ea1366986c8f685a1d5431f4': 'SOKZZGT12A67ADA4C3',\n",
       " 'c028c933682215a4ce945a40fbe787346417c241': 'SOBOUPA12A6D4F81F1',\n",
       " '0d2706babb74b7da0c3fd70225a321a17d78fbfd': 'SOIZFIO12A6310DBBE',\n",
       " '1e518976209751f3744a56e000b8fec497884ef9': 'SOCHKWF12A58A7C9B7',\n",
       " 'aaa3cccacdaba18ad131981acd4acbba25113f77': 'SOTJSCD12A8C14093B',\n",
       " 'dd60af63c38c1d32ff2f49bd61763ccf8ab71af7': 'SOBOUPA12A6D4F81F1',\n",
       " '5b97666b832568bb23042ec5a48f4857a69eb46a': 'SOANSPC12A6702154A',\n",
       " '4458aaefc3b0ad2ed44910d76042a4e74a6991ff': 'SOJHCOH12A8AE45F4F',\n",
       " '83ecb2a54c02be6f1c29c23189732287211d031d': 'SOPCQRT12A8C13B15D',\n",
       " 'e865f7aef482f3b1c7979421926db706604d614c': 'SOFTWWH12AB017AD0E',\n",
       " '49b142551f26ec13c3376b1d5601eff26649927c': 'SOKZZGT12A67ADA4C3',\n",
       " '705a048ff11349b59fb2b2dbd931b7242b636d45': 'SOPFOEP12A6D4F6C3D',\n",
       " '13255f2cf6c1930e2ece5e0e97b0f2643fe2e2c5': 'SOAMIQK12A6701D94F',\n",
       " '7d56c9fb1fc29a39a41ddce5fcc03a4458a53b4e': 'SOPUSNZ12A6D4F9684',\n",
       " '8488b3a592b88d044c7229d508004a4ae759b7fc': 'SOMHTUR12A6D4F8764',\n",
       " '998b24c14f19ec46abf79497c6c2ae7f100ec477': 'SOFTWWH12AB017AD0E',\n",
       " '57f71c6cf2b1aa468e02ca104b13875db5bf3066': 'SOLAUOW12A8C13A400',\n",
       " '77a4ea31d9357ff0989644829f5fd6c48cc4020f': 'SOBKLTU12A58A7FB77',\n",
       " '73c772cfb72ebc1429ad607567c8c52ac12e630c': 'SOISNSU12AC468C0D8',\n",
       " 'b99745376271b01b3d5c89e74ad8e4df01824e5a': 'SOPCQRT12A8C13B15D',\n",
       " '859b4ac553a0dfebfe8a4c9d1a7b59e8dfe0a751': 'SOITFCH12A6D4F9478',\n",
       " '0e066a0791cd766df671fe7a6d37e7d9bf13f4a3': 'SOXEDZH12A8C137D06',\n",
       " '7da4076aacc6cda87735ccd029bde2d57fd5cb3a': 'SOVWHPM12AB017DABB',\n",
       " 'c55b4854111dcad40e0ca2700de86956503196aa': 'SOIZFIO12A6310DBBE',\n",
       " '779a467601f587e7e109c2654cc47c79340a3168': 'SOQHOUQ12A6D4F8DA9',\n",
       " 'e7d49284dda912e361cde4c25ab6b1e58520d6bc': 'SOJSGZT12A58A7E75C',\n",
       " 'e892a0c5d48ec4d7b78ae8f38ff9dfe30b02b8e5': 'SORCEQI12A8C1440BD',\n",
       " '602aadac0610fa40bff7cc83d9fc15d705b1c72b': 'SODYAQG12A6D4FD15C',\n",
       " '195efce9c090f281c625cfcd43852571563b4c3d': 'SOVWHPM12AB017DABB',\n",
       " '21de01555c9e6b1fdf89c1325d83adb755ec9680': 'SOBBKGF12A8C1311EE',\n",
       " '1c78b8e3d929b102a68c153aa5d9f553004b69e9': 'SOISNSU12AC468C0D8',\n",
       " '80732e5c0f1ea48da3882f146354fcdf845c2500': 'SOXHIDK12A58A7CFB3',\n",
       " '62b75e9bcfb24034b5c34ca0f3f1b619690fd26a': 'SOISNSU12AC468C0D8',\n",
       " '834a957189a046ae283ae9a980339a527f4a9722': 'SOYKKZP12A6D4F78D0',\n",
       " 'a3febb1c03f287ac65b0afa2d33cb405006bd975': 'SOGPBAW12A6D4F9F22',\n",
       " '961d8d041f8e44ac82acc3ae6e82b3b4396f6273': 'SOISNSU12AC468C0D8',\n",
       " 'b5a08f81c5bd2dbe15cbf76a40cdd0d764832044': 'SOCBQKE12AB018548E',\n",
       " 'de6dbd33a571f601b84c62ad374c7c10b5458040': 'SOISNSU12AC468C0D8',\n",
       " 'bdbfda8403d3d2331d35c8c6024cf40dd193d245': 'SOHWXEU12A8C1320D1',\n",
       " 'a801c22b9f2c5b8134c08b41631b737ef397b81e': 'SOJHCOH12A8AE45F4F',\n",
       " '7f5d9a71ba00ec875512251f2a63af2e21a97a16': 'SORWEEW12A58A7A935',\n",
       " '7d69f3bf0056731a2c5b5c2bda14d3e33cf9a7e3': 'SOBOUPA12A6D4F81F1',\n",
       " 'a39c1817c10d820820c108e9708d1d1dcd4cc9ef': 'SOJHCOH12A8AE45F4F',\n",
       " '6b192e76c5c5d52c074d1271709242fe90b9875a': 'SOBMKJU12A6D4F7128',\n",
       " 'd6ea80fb95dabc4b6bdad1c48c83172f5c40bcb5': 'SOVWHPM12AB017DABB',\n",
       " '12c625353fd8f4ece03ac47a7c32c5f87bb947a4': 'SOSUGSC12A6D4FB0C4',\n",
       " 'c0fb76534ecda144beddaeff3a09e477d5468290': 'SOIZYSO12A58A7BA28',\n",
       " '100e2615667df7ea755e35db24e5c8ee5a169bda': 'SOHZDYL12A8C141C73',\n",
       " '9db8ce8ecd6f8653c98fb5a4a785a25ecdfc6d53': 'SOISNSU12AC468C0D8',\n",
       " 'ce2f5e904d3471055f2aeb42400233cda9dfe87f': 'SOHWRJH12A8C139AFC',\n",
       " 'f9b92ffabfcf0bd52bd2cac86bba6b18bb497bcd': 'SOJSGZT12A58A7E75C',\n",
       " 'fb2a5ee501a246516461720cf83b8f8369208cd3': 'SOAMIQK12A6701D94F',\n",
       " '0afc48c45a10806a3d236d9f6f580d405579c9db': 'SOGPBAW12A6D4F9F22',\n",
       " 'c94a8bca288217d3e7c79e7de29a372e6e12709f': 'SOBOUPA12A6D4F81F1',\n",
       " '3244fdbee01957b71ab6275e5b2f251654ff040d': 'SOGPBAW12A6D4F9F22',\n",
       " '3e9476019c20da6fdb50a296d2fb5dae51c5bd00': 'SOHWXEU12A8C1320D1',\n",
       " 'caa08398f5299f2f24eb44d685a62b5eb72ac450': 'SOYABSZ12A81C1FEAC',\n",
       " 'cafdef6741749f684a7daa62b130c81bbb4ded5b': 'SOBOUPA12A6D4F81F1',\n",
       " 'bfad993366cc67277228788cee2cc39b95a20203': 'SOHZDYL12A8C141C73',\n",
       " '542302c7b3c66e23fd302bef7303ed306c4f2511': 'SOXNZUH12AB018393F',\n",
       " '78092695498899e2099033137fc1e5d7ccddbc39': 'SOYABSZ12A81C1FEAC',\n",
       " 'be8cabfaa29a0fa184c503749ee578bc1868be0a': 'SOBBKGF12A8C1311EE',\n",
       " '6d2ef0308be4111a2fdda82e11d0997aa82afb99': 'SOISNSU12AC468C0D8',\n",
       " '0a0ae207a8de699485b40b057dde925d69be9dc9': 'SOCRVWC12A6310F991',\n",
       " '7aa6b1122d264b6721453fba0153ced039c7d255': 'SOOROCA12AF72A07D1',\n",
       " '3c40a81d3a4187572d1297c038e75965507760e1': 'SOIDEPI12A6D4F98D2',\n",
       " 'fcc77b43d0a489133160d2f27fec61a35f17c6db': 'SOBOUPA12A6D4F81F1',\n",
       " '3009aa102fb450df122887132d3a663f31a565d2': 'SOGPBAW12A6D4F9F22',\n",
       " 'b9e2d5790fe3b6329095f578feec4f20895f3cf7': 'SOPCQRT12A8C13B15D',\n",
       " 'c9afffc9be5c43830ee5f7f3697c2988c52f571b': 'SOBOUPA12A6D4F81F1',\n",
       " '012c1e24e2b24416a3a50a88ad749259666e946a': 'SOGPBAW12A6D4F9F22',\n",
       " '14914d49420374e251f518cf12c929d0fb9889e8': 'SOUBKFT12A6701F07A',\n",
       " 'f9bd46cfa6b0cc79108a758d5683b90ff9ffd730': 'SOOHDXT12AB0181797',\n",
       " 'ef5dc99fa13a6c2adb82bb10ac62647eadbfb1fb': 'SOAMIQK12A6701D94F',\n",
       " '7d8f17ead3b54ad66ff84012a51b9bd033768bbf': 'SOICRPT12A8C13190A',\n",
       " '19f83540e71fc5e4e78874317350f4b746a93375': 'SOGPBAW12A6D4F9F22',\n",
       " 'e9bd53293e1654b77639badb40957e8f07810fea': 'SOUCPUM12A81C20BC5',\n",
       " '45b1115989a61e30d54a802e66e154e17d62d4af': 'SOMHTUR12A6D4F8764',\n",
       " '4c052e304ffd7de1201dc6227d93debe04c11b68': 'SORJNMJ12A8C13D994',\n",
       " 'e0f6db24e85ebd67ca838eb2d09c5187f59c3a21': 'SOAMIQK12A6701D94F',\n",
       " 'ce87ec38f2c4a24e5708733a597c9f1188dc0fa9': 'SOFTWWH12AB017AD0E',\n",
       " 'f90b928a571ddcfbbd33f216c98c11c486b48323': 'SOFTWWH12AB017AD0E',\n",
       " 'd888cc6dd99eae1de282a8cdd183966f66eefcc3': 'SOKZZGT12A67ADA4C3',\n",
       " '0d59391cfb63158b48d01d0e149dc32627fe15b1': 'SOVWHPM12AB017DABB',\n",
       " '6cc9f3f79da0e61bc92d2d9ce6e2f6490a1c4f35': 'SOBOUPA12A6D4F81F1',\n",
       " '4b8858c2c1a5eab5291b60ee014912acbd5ddd5a': 'SOJHCOH12A8AE45F4F',\n",
       " '4cfecf7e402d66b354dff530a0a1bd758e342eaf': 'SOYABSZ12A81C1FEAC',\n",
       " 'cfe09ef9b032e1b4fbafc5fa1763a8fbb5926b99': 'SOIZFIO12A6310DBBE',\n",
       " '2969011c97c3c738cb4b0d4605f814b881a55845': 'SOHWXEU12A8C1320D1',\n",
       " '118eeab7a9f14f40d4db0cabdb9ab44bd3479840': 'SOIZFIO12A6310DBBE',\n",
       " '93f4f3e2cf9d23f4f01cae389efa6547226c051f': 'SOTJSCD12A8C14093B',\n",
       " '5d5a174280f3d3f2c73e88a7f8bde20de3e53140': 'SOZHUUI12A6701D7B6',\n",
       " '5fdfb64990da355ba0710db3f806736703439941': 'SOBOUPA12A6D4F81F1',\n",
       " '2a23fe754e7a371ac21bce46aa7ae3c045b6b4f9': 'SOGPBAW12A6D4F9F22',\n",
       " '0a318d5ce33967f8d7bfa2662a7404b91aef1083': 'SOBKLTU12A58A7FB77',\n",
       " '1c47322c11f412de1b508e785b14b822d32cbce1': 'SOBBGTM12A6D4F6199',\n",
       " '12415bbae473f2dbc48a816c0acffc472b1c225f': 'SOXNZUH12AB018393F',\n",
       " 'fb9706f47da93f6aae8cf4e70da3ac284f222e4f': 'SOSUGSC12A6D4FB0C4',\n",
       " '1ef80410ae65183e07438c6613381d6d697fb479': 'SOGPBAW12A6D4F9F22',\n",
       " 'f6cbd0106b6cfc970e465a1dbe96421b15d99be5': 'SOBOUPA12A6D4F81F1',\n",
       " '4e4bacd11a3bb259bff325f7f540b61d3e5b6178': 'SOPCQRT12A8C13B15D',\n",
       " '5b6e6cca21dbfec946d59763d8e98b4f2d36bfec': 'SOTNEEA12A6D4F7F8D',\n",
       " '4e4903a8e18e59afb8681c06780e7fff2ff403ca': 'SOTNEEA12A6D4F7F8D',\n",
       " '1fbb0f6de552dec6eff67288fbaf3efeae2a2427': 'SOKZZGT12A67ADA4C3',\n",
       " 'c6e008c75faf955293cbc0d206ddea6e242ad258': 'SOGPBAW12A6D4F9F22',\n",
       " 'a973d740433beeec729d853c3aa6bdcd81c8fb94': 'SOZQSVB12A8C13C271',\n",
       " 'f9b1db0d99358c0703ab38f29871b5f369ffae44': 'SOIZYSO12A58A7BA28',\n",
       " 'd0d6cb6ad5c66fc5c0848f4bafcbb82e980fdda4': 'SOIZYSO12A58A7BA28',\n",
       " '855bf192acaf0a2169900ee96cfa9317bff90c76': 'SOUBKFT12A6701F07A',\n",
       " '82d737e4c18c3c08c8ebbf834ab4208d24dfa5e7': 'SODPPDY12AB017F767',\n",
       " '9510f81c21da5576ad822e06bb627adee4a7d23a': 'SOBBKGF12A8C1311EE',\n",
       " 'dc1191a50877cf8b9446cc27891b3fc0b8bcd970': 'SOYSWHI12AAA8C5BFD',\n",
       " 'f87f1ce7c192de4c04bd5726f8f8f99d71490903': 'SOHWRJH12A8C139AFC',\n",
       " '8e201011adf9a261f7eca30657b2571ec17be7b5': 'SOBOUPA12A6D4F81F1',\n",
       " '77ceda0a3c03cda0d6d68016b12bcd7e943b6c09': 'SOFEJPJ12A8C145455',\n",
       " '4635e299e04fe4cf4abec168ecd3baa38b0186b5': 'SOBOUPA12A6D4F81F1',\n",
       " '6a4b493d32b6afb47124be0c22c9949b7e3ad3bb': 'SOUBKFT12A6701F07A',\n",
       " 'c2a9eae5c1295a5dd8ba57b0717631d8bdc96179': 'SOWBTPS12A6D4FA5BE',\n",
       " 'a2fef2ba220721e81c5e5de319eb211594e35ed6': 'SOPEFDW12AF72A1709',\n",
       " '00d31213b5db4daa993849db92ae2557b6f2a221': 'SOKZZGT12A67ADA4C3',\n",
       " 'd371203db29f442a701ab641180e452d7b5721eb': 'SOZQSVB12A8C13C271',\n",
       " '3f6d334a5ee7f714810304be03a1ed2c401e5045': 'SOSGEGU12AB018188A',\n",
       " 'b9f94d9ec17b34f730b5ca1628047450b48ed6e9': 'SOPCQRT12A8C13B15D',\n",
       " '1919a984274d9d53ec9cdd6d0e079b3d4c67939e': 'SOHWRJH12A8C139AFC',\n",
       " 'b3e14fb70a964679bc66901e1c6531653b075a6c': 'SOBOUPA12A6D4F81F1',\n",
       " '9beeb64b4146c297fff6fba4147d5833056935ae': 'SOGPBAW12A6D4F9F22',\n",
       " 'b690ebbd71e2df29543a7a3a75f8d92b3c3a4274': 'SOBMKJU12A6D4F7128',\n",
       " '10ecd118efbae11d8f5af64fe95f7f0e6504e4a8': 'SOBBKGF12A8C1311EE',\n",
       " '0e6ed564cf2472e161bf79795a0406a5895f9e8f': 'SOBBGTM12A6D4F6199',\n",
       " '975237c7034a847cef86ea794d98aa70a49505e5': 'SODCNEE12A6310E037',\n",
       " '6a9867cc59b187ef0af31ace1be220a464164e81': 'SOHWRJH12A8C139AFC',\n",
       " 'da1465ba218de8e523b6e89f69374dd261c54539': 'SOPUSNZ12A6D4F9684',\n",
       " '72bf3bbe4b40da7baae83e034a2da43a5880395d': 'SOGPBAW12A6D4F9F22',\n",
       " 'a64ffcfd93559fad450a769bb638335af757bef7': 'SOEWPZY12A6D4FB168',\n",
       " '2b7ffbf4dcb7fda7a9ede9c832cb9feb6e6f2c6b': 'SOHWRJH12A8C139AFC',\n",
       " 'bc4aff55bbf95d1e496e0b1827758c187687f0fc': 'SOOHDXT12AB0181797',\n",
       " '53ec3e8dae87fb407353067cc20c4c4b46768f9b': 'SOLAUOW12A8C13A400',\n",
       " 'a59f64c9f4726e4345f194f81ecb706fba4cd942': 'SORCEQI12A8C1440BD',\n",
       " '945ced71e099469a19066c2e5817d97295234e7d': 'SORJNMJ12A8C13D994',\n",
       " 'ad1ef82eb5788ecb45410e45171328cd2f42e1aa': 'SOYKFFK12A8C14391D',\n",
       " 'f5806da133eee3764a1f572f099cfc917afa806b': 'SOVYIYI12A8C138D88',\n",
       " '5f06dc1c23fa310f1db4d7152f180429cabc14c7': 'SOBMKJU12A6D4F7128',\n",
       " 'ada51d830bde6512db7d2d99b9a44c7c83c07826': 'SOICRPT12A8C13190A',\n",
       " '3f2bf2e31fd9e93e911be0118c73bac41438720d': 'SOISNSU12AC468C0D8',\n",
       " '01be200bc92db8e650db8e67837e687a26db0a45': 'SOYABSZ12A81C1FEAC',\n",
       " '67d558fd23fe47f45e991b155140b84fe1c09b06': 'SOUBKFT12A6701F07A',\n",
       " '602c44909f230883b2cf08bb1bb11c96074bd1b7': 'SOBOUPA12A6D4F81F1',\n",
       " '627f2572ca2f4a7acedeb66e1dec3d777d5b97d4': 'SOCHWPT12AB0184F15',\n",
       " '4f600b57db6e17efd6711556acbc2909d4bbfce8': 'SOISNSU12AC468C0D8',\n",
       " 'd1df1058e0ad77455d65d0a2b9911cae8bb2021c': 'SORWLJM12A6D4F9C0C',\n",
       " '124782d0cf7f4537cc93e47053bfa9df8b59da23': 'SOBOUPA12A6D4F81F1',\n",
       " '325289794af810e29c1854302420d759a72c0bd8': 'SOWBTPS12A6D4FA5BE',\n",
       " '8edf2ef4a55a6b97b03f90d29e5ba8ebf05053dc': 'SOXHYVQ12AB0187949',\n",
       " 'f82fc33f9937b95afe6ac872af55bd9bf9bd3bbd': 'SOGPBAW12A6D4F9F22',\n",
       " 'ecfa2096bd4f47054e8d3e29503c505746f58015': 'SOYXAUC12A8AE453A0',\n",
       " 'faaa61e9810d13bc7ffb2f0faf64787d3fcaea16': 'SOBOUPA12A6D4F81F1',\n",
       " '88a5e1be9f12e432ac7661a2cd65f76c4cc72fa9': 'SOISNSU12AC468C0D8',\n",
       " 'cfa8f1c9546fd9fcfe33895236ff8eb8a34a1c32': 'SOGPBAW12A6D4F9F22',\n",
       " '9b4df6ba615fdd0c49d02ef92af66fc86121a3a9': 'SOXBRKW12A8C142084',\n",
       " '6328d1c2db70cd7c6feb784303ef2c43cee7d227': 'SOYKFFK12A8C14391D',\n",
       " '8d168a76c740a4f34ee4041e0af52c590c2a3b70': 'SOTJSCD12A8C14093B',\n",
       " 'de7cd772a16ea928b6387514d7bab44f06239eb6': 'SOGPBAW12A6D4F9F22',\n",
       " 'ab56b0f6e9d3cd4754ed13413717e0bc2ed657eb': 'SOMHTUR12A6D4F8764',\n",
       " '91008efedbdb903424a51e3cd18b8b80624dd4f4': 'SOHWRJH12A8C139AFC',\n",
       " 'ffb4319a27512b96a37514eb851368406b6a3cbf': 'SOYBLYP12A58A79D32',\n",
       " '10c880810ae8c371e241cfcdebdd4c5adcb0d4a7': 'SOXERNH12A67AD8642',\n",
       " '1958046f4aab95ae485306b74528a4e068530225': 'SOSUGSC12A6D4FB0C4',\n",
       " 'f88290a49fe5190e9ce6a5ec49ca36922fb2673b': 'SODPPDY12AB017F767',\n",
       " '3222dcc55712610d1aa74ece2c2a987b9e8f8d06': 'SOTJSCD12A8C14093B',\n",
       " '2bc9147f20255589a3af576c5e6316ca3ca3aa86': 'SOBOUPA12A6D4F81F1',\n",
       " 'c1912062175dc4b3ea5a3a0cdb963c704bb9c881': 'SOGPBAW12A6D4F9F22',\n",
       " 'df366ca132b1fcf0aac22257040f6b96794d25e6': 'SOBOUPA12A6D4F81F1',\n",
       " '91e13541545686c9906f05410e002ebeb8b92785': 'SOYABSZ12A81C1FEAC',\n",
       " '3c431e99f3ad1bb671bc9222b10941e7eb49fb26': 'SOGPBAW12A6D4F9F22',\n",
       " 'c24ae02545f295bfe0dff09fc60da523fb9fbc95': 'SOFTWWH12AB017AD0E',\n",
       " '401cfbbc54d966d33df5f3d68bf1c3a490e43536': 'SOISNSU12AC468C0D8',\n",
       " 'd9acdb6d6fbb322156be1ddafe16efc6540f6a86': 'SOCMNRG12AB0189D3F',\n",
       " '7f0315e8c344c8913589aebd039f9e2b842fb748': 'SOXHYVQ12AB0187949',\n",
       " 'a3d38dda9eac54655b77413cc0cca1c1c2fdb309': 'SOGPBAW12A6D4F9F22',\n",
       " '730e7c9b13502507e59eb9137365be93a4d40528': 'SOVYIYI12A8C138D88',\n",
       " '67fa4f87ad9981af183f41747033ab90e37720b6': 'SOYABSZ12A81C1FEAC',\n",
       " '0c68c2ce0eb50e2f8f28dc9759cc4a11baaff6f7': 'SORJNMJ12A8C13D994',\n",
       " '0fc386abec421f6fe3b3c3c979cf55d73d179403': 'SOZHUUI12A6701D7B6',\n",
       " '745e203e0dccbfd193dc11142890711f00c9e138': 'SOOEQXL12AAF3B4D73',\n",
       " '7f3e3eb6b169aca06791c5dcd9249762b29bdbd9': 'SOHWXEU12A8C1320D1',\n",
       " '2a7e38c08c86036fa68f5fb7d67d1577c68ead8d': 'SOCPIVV12A6D4F7B4C',\n",
       " 'ee45039142e358da6fb80a68fca335d2a65c3def': 'SOANSPC12A6702154A',\n",
       " 'afebc431aaee88d462a97f27d2ac7c1d0356fa9e': 'SOTNEEA12A6D4F7F8D',\n",
       " 'f88c813e4ac884b611f0a779f1747be18e8849b7': 'SODCNEE12A6310E037',\n",
       " '8699342ab7e1f0b3350e824b773ead650b99141a': 'SOGPBAW12A6D4F9F22',\n",
       " '957e4621e7d1b3877470eadfe65ee25c1c7a45e5': 'SOYKKZP12A6D4F78D0',\n",
       " 'b222751896bf1d965fee510753dff4941102157d': 'SOITFCH12A6D4F9478',\n",
       " '7e12d05bf7140617f476429cb448f67c8009107b': 'SOHFKGU12AB01819F3',\n",
       " 'ea3d66c99d9bf0b62c821a60d8c309889c25adef': 'SORJNMJ12A8C13D994',\n",
       " 'a3ee72395cd10f8a295d4334ad85cd24fa0ae9ca': 'SOISNSU12AC468C0D8',\n",
       " '404642134be312559e7e5e6ceebae850575b39e8': 'SOXHIDK12A58A7CFB3',\n",
       " '816360087e5288337b0765a57a646f8294da90ca': 'SOLAUOW12A8C13A400',\n",
       " 'c251a28fcc23ef32be4510929cdcefed9bf3b396': 'SOPGOJB12A8C13B05C',\n",
       " 'e0f23f18d24717459cc0a676855b1b0c26b7f9dc': 'SOCHWPT12AB0184F15',\n",
       " 'e8111cc6597813a463e577f7cb0371a5c38056fa': 'SOXNZUH12AB018393F',\n",
       " '48e679a071a6cae4153e648c2c41e49be7ce6332': 'SOKZZGT12A67ADA4C3',\n",
       " 'b548b7d0ddff3162aa176139bf22f6329348e290': 'SOYABSZ12A81C1FEAC',\n",
       " 'e4ffa61d747dbb7240cbfa2c257cd1c7ddb46ed6': 'SOBKLTU12A58A7FB77',\n",
       " 'ac4859a4652eadd0b0b6ba2d96065032aeb19a5e': 'SOBBGTM12A6D4F6199',\n",
       " '28a9e575119e1874167f1ebcac850cef3d31c4d4': 'SOZHUUI12A6701D7B6',\n",
       " 'fbed37379495e8961ade6ce5b268ca01073f70cf': 'SOKZZGT12A67ADA4C3',\n",
       " 'd4cfc8b0b1177b285252b4c484f5ca3380092372': 'SOISNSU12AC468C0D8',\n",
       " '99ad4ab29c5d42588a94aae3a9ee71ef845330e0': 'SOXNZUH12AB018393F',\n",
       " '0ed1750142c35bbc0c656547e5f27bf3cfd97a52': 'SOPFOEP12A6D4F6C3D',\n",
       " 'f9837fa529299c7bb81c6ecf97e8d8a9722a1546': 'SOFTWWH12AB017AD0E',\n",
       " '020b15832020123e177743071975ddd3aa675d1a': 'SODCNEE12A6310E037',\n",
       " '3a0db18d80f867116b57bdf0bbfb4c1bbb6d7117': 'SOOHDXT12AB0181797',\n",
       " '118fb1bb8bd37b6ba3128e680eb9cc6d3ed984e1': 'SOIDEPI12A6D4F98D2',\n",
       " 'beed0f2ab6a6f70ff6f5308a43d5bb1a6d4366ff': 'SOYKKZP12A6D4F78D0',\n",
       " 'fcb30ebe068bac59c9e6cabebc60cb9262db30c5': 'SOYABSZ12A81C1FEAC',\n",
       " '3e67b3ca527c74f3bc9fb92a3fd0db731d4ecab2': 'SOCHWPT12AB0184F15',\n",
       " '71065fef74d62cd6d045e771b77a2f8f5e4a29b3': 'SOPCQRT12A8C13B15D',\n",
       " 'efd00040556d796bb38cb0ed34f6181b1e8704a6': 'SOPFOEP12A6D4F6C3D',\n",
       " '096b6122966c1fe6f0191e8b23ce2afcf0bf0ab1': 'SORCEQI12A8C1440BD',\n",
       " '4e1254b8d8409802eba02491d689c0e9f8d7b0e1': 'SOBOUPA12A6D4F81F1',\n",
       " 'd0a0df91ebf4d47b1161150a6ee750d110781b8d': 'SOISNSU12AC468C0D8',\n",
       " '5f179d704979b6910829d10ffc7d473b4e75a03a': 'SOPFOEP12A6D4F6C3D',\n",
       " '4542b6bc6b86b9424e01974417750b4b9f9de1e5': 'SONIPQC12AB017B595',\n",
       " '329c2b1d3402abb86d077fb8cc0aa6363bdd5cca': 'SOSGEGU12AB018188A',\n",
       " '8efed0a399931d7600dd4a8a4524823f1132bae3': 'SOAMIQK12A6701D94F',\n",
       " 'a8dba4b6e2620465dd3115e602b7c6899e6db153': 'SOIZYSO12A58A7BA28',\n",
       " '490cf5d3b1a591ac934a7521ec6f2563d7e9195a': 'SOYSWHI12AAA8C5BFD',\n",
       " '5385003110b5cfdc82e35157c711392f07d57939': 'SOWBTPS12A6D4FA5BE',\n",
       " 'c318ddd591a720dc16917b6d214a011ecd90cafe': 'SOZHUUI12A6701D7B6',\n",
       " '59c00833985bddcd12b9fb9cade78c275c6e1003': 'SOICRPT12A8C13190A',\n",
       " 'b1b70a0c7e398fa3f7a49403945dc4deba89b261': 'SOITFCH12A6D4F9478',\n",
       " '5ab25f66ad9ae2018444aee1d0edb012ba9fcdfa': 'SOBOUPA12A6D4F81F1',\n",
       " '96cd0ae2bcff4bcfa9fef63e333516383ea72076': 'SOANSPC12A6702154A',\n",
       " '436e521e05e9ca26c2f1d1ec49d021e7f59f135b': 'SOBBGTM12A6D4F6199',\n",
       " '05b3f56275c55ece808b61ca6bd2951ef45d1c8c': 'SOCBQKE12AB018548E',\n",
       " '9322befac52f69afbf9dfd77b2fadbc4ea1017d1': 'SOHZDYL12A8C141C73',\n",
       " 'bfd8f6035809daaef2fdcecc37fad6b60887f4e3': 'SOUKLPY12A8C1451A8',\n",
       " '4895de32864c8f89f1ae2395db6f61fa0aff56c2': 'SOBKLTU12A58A7FB77',\n",
       " '03dfff9b5683061323d69a3184ab52fbefc37f14': 'SOSMXVH12A58A7CA6C',\n",
       " '905ed278026ae37577bea74e22101f5221e4beb1': 'SOPGOJB12A8C13B05C',\n",
       " 'b4a3c665155648e68893c46db579cb7a1ffbdbe4': 'SOAMIQK12A6701D94F',\n",
       " '36ab6e9aea7eafa66ae3aec33e5dbbd9b87167d5': 'SOGPBAW12A6D4F9F22',\n",
       " '3623cf4cbce4a22d9a46dafa52c2bb788653b110': 'SOISNSU12AC468C0D8',\n",
       " 'ed3eb115bfc8ac093507f0d5736e8c71d961383f': 'SOHWXEU12A8C1320D1',\n",
       " 'ea0e8aa8fc92550093c60c1f24b1000807aa2c86': 'SOOHDXT12AB0181797',\n",
       " 'a8ff27bb4b5ddf8c9eced096248326cede103750': 'SOBKLTU12A58A7FB77',\n",
       " '70b9f414e5768c8c304ee1d2dbd2dcd186f5f141': 'SOBKLTU12A58A7FB77',\n",
       " 'a833f8a8b0ad9f691fc59eebadf83bb1157b2b99': 'SOBOUPA12A6D4F81F1',\n",
       " '3a12c4dd160e2571ce2525da1e28117b943f266d': 'SOPGOJB12A8C13B05C',\n",
       " '79c48b4424b1c2aed653b515b2b69b6644ed5e95': 'SOAMIQK12A6701D94F',\n",
       " 'c49a0355731ad35e6c49b8baf670aa5bf82be74d': 'SOCRVWC12A6310F991',\n",
       " 'bd254079b3e823b988df6034775f1cfd2ca3d5b0': 'SONTIBS12A6D4F9CFE',\n",
       " '0d2bd656b3ffb7a87b3dd2c34952a7a4f2edba05': 'SOQHOUQ12A6D4F8DA9',\n",
       " '0749d27168da8466b5ef30145d22737ed4365786': 'SOLAUOW12A8C13A400',\n",
       " '5fd78e002f8ee1d0c771f457ac37bb2cece76190': 'SOBOUPA12A6D4F81F1',\n",
       " '406be0642796f3c57280a8ed52e7eec5851c88bf': 'SOPUSNZ12A6D4F9684',\n",
       " 'b16140f2dfbdd56f9d6da1491575f0d448452f83': 'SOVWHPM12AB017DABB',\n",
       " 'cd5d742c84adec44559541e17527dbca42c6716f': 'SOIZFIO12A6310DBBE',\n",
       " 'abfd2daf7f6adf82354529b98a5d9b996cb285e1': 'SOITFCH12A6D4F9478',\n",
       " 'a57a37bd1ef15194927fbac3f41180e7872237e0': 'SOITFCH12A6D4F9478',\n",
       " '01d2da4a5a95fb9ea34586f6a86c2743de86da06': 'SOGPBAW12A6D4F9F22',\n",
       " '15f455dab9f3d501db8d26f27c4e2178934a3b1e': 'SOUBKFT12A6701F07A',\n",
       " '01c8ead25937a43acafeec696383a79ab05f129c': 'SOUCPUM12A81C20BC5',\n",
       " 'dcc24176665a646ad59dbe0c92c3dfbfcaa57d75': 'SOVWHPM12AB017DABB',\n",
       " '36f90b0b4f9a74665810d493ad490b107edd1626': 'SOBBGTM12A6D4F6199',\n",
       " '225f6310d4f8e8c2df67dcb5ce69c5d7a909a3a3': 'SOHWRJH12A8C139AFC',\n",
       " '5ce069029bc07f37848a0916dbf91d466ee3b6cc': 'SOGPBAW12A6D4F9F22',\n",
       " '4e3398ef89d9c00975d0b0f5b7bc7b7f067c7902': 'SOLAUOW12A8C13A400',\n",
       " '12cbf5847590156cb73f8aaa87d60ddd1c5840ce': 'SOXHIDK12A58A7CFB3',\n",
       " '644059e7525fd76286c5f0d979f714fd14006710': 'SOISNSU12AC468C0D8',\n",
       " '50507eb2614f304eda9003610d3f93d9a6c94897': 'SOCMNRG12AB0189D3F',\n",
       " '08a87ceaa7c90353f08426f2e712ba0f57f21cdc': 'SOQHOUQ12A6D4F8DA9',\n",
       " '7e2a2bbe97568dfce548b1d8539354b8536e6b85': 'SOFTWWH12AB017AD0E',\n",
       " '366538f2dbe83001cb9747b8f0b1b294642225ee': 'SOJHCOH12A8AE45F4F',\n",
       " '5c709671983e6cc90cea872597f02cb506d17284': 'SOXHIDK12A58A7CFB3',\n",
       " 'bb9076da400519f146e27ebff696fb8dfebbc682': 'SOIDEPI12A6D4F98D2',\n",
       " '83d32357a4fb1e41e342c6ad2a7700229e2d8da9': 'SOIDEPI12A6D4F98D2',\n",
       " '5adc5722ea2919bcf0a6d1a105a2b37392a1cb49': 'SOIDEPI12A6D4F98D2',\n",
       " '1553eb91cad73c27d6895734edd49073bc2a5f9c': 'SOCPIVV12A6D4F7B4C',\n",
       " '9f69c0abb4f875a435fc3ca2fa5199e21fc27419': 'SOXHYVQ12AB0187949',\n",
       " 'aeb00566f301763d54254bae3eec0665f34f5c0d': 'SOISNSU12AC468C0D8',\n",
       " '52862014feb03897e0026ae0f3da57f5c913a9c1': 'SOHWRJH12A8C139AFC',\n",
       " '02e5e48f2ea3ef82fba08e80e75f6df1a251daae': 'SOGPBAW12A6D4F9F22',\n",
       " '8639f738b6e581bf7f12a83e21443874a7b18f38': 'SOGPBAW12A6D4F9F22',\n",
       " '1584577ec20c145837f9ea6d3853ca9dcb31cac6': 'SOXERNH12A67AD8642',\n",
       " '170611adc27f6c312d8b229e4119117831ae6126': 'SOICRPT12A8C13190A',\n",
       " 'bd1464fe24036c5aaa358656e59dbfaa611fb95e': 'SOZQSVB12A8C13C271',\n",
       " 'bd56e147319aeb485340f2a8d0e3f85c808f26a5': 'SOBBKGF12A8C1311EE',\n",
       " 'b5b81b63102440f7610539112f69d8c74d07a6e8': 'SOANSPC12A6702154A',\n",
       " '484d7e1aef71c822d63622f6b575dfaca7ef8f62': 'SOBKLTU12A58A7FB77',\n",
       " '6c6289326f70321f2b3e072daa44819efc55639a': 'SOKUFKO12AB017F75F',\n",
       " '66db51c9caa62883b61d867694834ecb03aeee0b': 'SOGPBAW12A6D4F9F22',\n",
       " 'c2380d33f0892b3ab0a1c78dc4c1be9526f64ae8': 'SOHWXEU12A8C1320D1',\n",
       " 'fbcba910b8a6512001d03fac5aa3182a3572d94d': 'SOFEJPJ12A8C145455',\n",
       " '2e424ceea259b11a535bc8039f7305abdf1b47a5': 'SODCNEE12A6310E037',\n",
       " 'ed2475dec33ca6330e6b2091fcaf768ad15e7960': 'SOVWHPM12AB017DABB',\n",
       " 'b6af7d66ded2229cbeab19b1a78ed217da06c580': 'SOZHUUI12A6701D7B6',\n",
       " '16df6b86475d346063b900ebb91ff728f1ea5fdb': 'SOGPBAW12A6D4F9F22',\n",
       " 'c075ae41b08b4d2d6d9d84a8f07a30c80d7c33f3': 'SOBOUPA12A6D4F81F1',\n",
       " '35bac352f01f9a6ad6250a3d26ea1599bf6e611a': 'SOJEHJV12A6D223C0C',\n",
       " 'a76f0a79f70c6105830da868083c5ed61c62780a': 'SOISNSU12AC468C0D8',\n",
       " '514121020829dceb4d6d64fd797b5205aff5831a': 'SODCNEE12A6310E037',\n",
       " '2cca84830533256af77986a1b5521dbc7cec138f': 'SOJHCOH12A8AE45F4F',\n",
       " '75176246cb72dbae5acd8cbeb958444a0372f421': 'SOCBQKE12AB018548E',\n",
       " '3a7b8d494de0d2ee3466c172e4713acaa1f27131': 'SOUCPUM12A81C20BC5',\n",
       " 'a9184fe7daa3b152c6ade724a0561b9f73049f0f': 'SOKAESA12A8C1410A1',\n",
       " 'df2bb8e8c106c78b82db69f6b7c92ae1f408a829': 'SOCHKWF12A58A7C9B7',\n",
       " '599c36b47deb7206830bc8ff1ff86545223e2382': 'SOGPBAW12A6D4F9F22',\n",
       " 'e30fef8cd98607f6751e40f8ea1bf4cf4f800c7e': 'SOBOUPA12A6D4F81F1',\n",
       " '39ecb82d6ddf7eb5c65a18b4842fdf81793513fa': 'SOBOUPA12A6D4F81F1',\n",
       " 'd3e1953e13f7c062d807da72a0ce6198c7178aa1': 'SOBBKGF12A8C1311EE',\n",
       " '9bc9ebdc557491375379c0acede5268c56fae114': 'SOFTWWH12AB017AD0E',\n",
       " '9c900bd679d05c2f8b6e749fe1be4e6236341eab': 'SOXNZUH12AB018393F',\n",
       " 'f5c09b43013a962a3c8abbb67a4a22497e8a0be8': 'SORWBEB12A58A78BF8',\n",
       " 'c4f427749e10ed90addbdfffa102e002d239a17d': 'SOLAUOW12A8C13A400',\n",
       " '0ad0283d63a5c591a104142f8a2f5bbd779389b0': 'SOFEJPJ12A8C145455',\n",
       " '28450a6a54bd95c18bd67b2a78f999bdf7fd8bc0': 'SORCEQI12A8C1440BD',\n",
       " '66cd1b535faf9655b2e2f0deb1e1c6d770d41a2f': 'SONTIBS12A6D4F9CFE',\n",
       " 'badaaf9205760c0cf5973e3f10c4935cca6afe9f': 'SOFTWWH12AB017AD0E',\n",
       " '88df248425c1db74adc446f9cbe536ea86a6a680': 'SOZQSVB12A8C13C271',\n",
       " '64ab322eab6758b0f19bf67bbb8f51423208003f': 'SOBBKGF12A8C1311EE',\n",
       " 'b79755bddea90ed16bc48036909cdb38b6d0624c': 'SOKUFKO12AB017F75F',\n",
       " 'cd80e6bad5b1c373654869a14755f2c20b2d4d5a': 'SOZHUUI12A6701D7B6',\n",
       " '09bb75cdf7fd63ec9b298a22d1ec12618bc3cb43': 'SOGPBAW12A6D4F9F22',\n",
       " '54b1c8ba8d3533a328e8e149351b5864b86705b2': 'SOZHUUI12A6701D7B6',\n",
       " '80c64182aea519818391137e81df0712126002b5': 'SOFTWWH12AB017AD0E',\n",
       " '7a5483ab823d04070b1113acd65a9cf7fd9a7009': 'SODCNEE12A6310E037',\n",
       " 'b45c378d263c7699393c678b16626921c95057ca': 'SOBBGTM12A6D4F6199',\n",
       " 'd94047050f4d74d7119c07afdff559cec2e9afa1': 'SOVXSZO12A8C13FD2C',\n",
       " 'a31565dc168749f1cf916387d8cb5763e83efa42': 'SOMHTUR12A6D4F8764',\n",
       " 'ff2a994a140bf136ff2eb138cb4af488e7e52123': 'SOPGOJB12A8C13B05C',\n",
       " 'e193fea57d2446cf6d5a921ff0a99e62cd008eab': 'SOISNSU12AC468C0D8',\n",
       " 'cef6bcf86b55c86a923d120e176a69472ff689f7': 'SOCRVWC12A6310F991',\n",
       " '80fc32506026c327c23d9a79efe258b1269c3462': 'SOHWRJH12A8C139AFC',\n",
       " 'cb6ae8d213d0dc05484e90f20083a9c01ecf1e5e': 'SORCEQI12A8C1440BD',\n",
       " '3d86d004e9193acfca28d5dd840bbf4f748bacc3': 'SOBOUPA12A6D4F81F1',\n",
       " '5ed9e1d75ee7545eb256628ab2c26eb3744600b5': 'SODPPDY12AB017F767',\n",
       " '4b62e3b4016f51a102f9b519b95466bf4e6e73a5': 'SOCQOZB12AB0185685',\n",
       " '31c6307eecb19357fd0a38e3cc95d764b9c6d9b5': 'SOUYPYF12A58A76897',\n",
       " '7fd04a55cf6e8f508bd8aea3133b0d21e26c8781': 'SOZQSVB12A8C13C271',\n",
       " '39050bd47c24375ee8e787eca9ea782423efb25a': 'SOHZDYL12A8C141C73',\n",
       " '5fff03a709e8393ee08d37bbcb1f80c283de6468': 'SOANSPC12A6702154A',\n",
       " '36cd968e91590ca2bc587da5863bc06729eb37a0': 'SORCEQI12A8C1440BD',\n",
       " '89a8a916e7d854d2034296dbcea1224a1e7e355a': 'SOLAUOW12A8C13A400',\n",
       " 'c83084cda85f096446d41c9afc00d03e814f5d86': 'SOFTWWH12AB017AD0E',\n",
       " 'ee5869a229a8212b7d3e605be5c8ef92d2605906': 'SOPEFDW12AF72A1709',\n",
       " '98e025159dbbb7a3d91dc43483cd91eb1fb8c957': 'SOISNSU12AC468C0D8',\n",
       " '975779fe982b6f5df470967736bccf46c6d56fea': 'SOHWRJH12A8C139AFC',\n",
       " '3cdcf15114ac9923e4efa1f3d47aeac45b96362e': 'SOCRVWC12A6310F991',\n",
       " 'b119210a6ccb033cd6ef3c71f4d8f31451621c35': 'SOQXDXM12A8C134E8E',\n",
       " '5ca82cad06e4a9f75407b9ed05336dd3706096df': 'SOHWRJH12A8C139AFC',\n",
       " '53e8bf826fdf18439d820272be0c244efe28a8de': 'SOISNSU12AC468C0D8',\n",
       " 'a8337a05dc864a3518c25cd72c97045ac113cd9e': 'SOPGOJB12A8C13B05C',\n",
       " 'add8ed297c41fe168034ef139e305880f716d568': 'SOISNSU12AC468C0D8',\n",
       " 'c86891d02a17696940b40e94c3fb6c1aa7626f6d': 'SOXHYVQ12AB0187949',\n",
       " '4c7405942792abb0d05ad469bc2f48088acf08f6': 'SOOHDXT12AB0181797',\n",
       " '6f1b6e384b6d8f4c6694e9a85f2c190a7ed3e900': 'SOBMKJU12A6D4F7128',\n",
       " '20003d7b0042a3709ed29fcd19cae645769064c0': 'SOAMIQK12A6701D94F',\n",
       " '5fea670e19692c7eb939c9f0a78e8efca01030fc': 'SOUCPUM12A81C20BC5',\n",
       " '024a9a565c86220ef711d98a0350894f926ae318': 'SOZHUUI12A6701D7B6',\n",
       " '213a741eed66da46e3d42a3d4f72e9cc3a39f265': 'SOTJSCD12A8C14093B',\n",
       " '804e4dfd30dd4296b7e03bc163df482dedd8d46f': 'SOXERNH12A67AD8642',\n",
       " '272a8e7b932f088c7fd9925d6a679943c09503d1': 'SOCHKWF12A58A7C9B7',\n",
       " 'af5882b64a06524f8056d045adb4a47ae88863dd': 'SOCHKWF12A58A7C9B7',\n",
       " '4473fde6c309cbb09ca52cd000eedd5d9f96afdf': 'SOAMIQK12A6701D94F',\n",
       " '0f31fb85d476a4620c7f702db16ce9636ab7e39a': 'SOHFKGU12AB01819F3',\n",
       " 'd7815875c719fa969018ed9a429ee7d398e12204': 'SOBKLTU12A58A7FB77',\n",
       " '271f0faa51e11dcd2967063966df42404371a210': 'SOBKLTU12A58A7FB77',\n",
       " 'e1b883c682268c100b1af68f95423adb525906e9': 'SOBBGTM12A6D4F6199',\n",
       " 'c4ba16dfe7fface5542ba58d722ecdcbf05bb4e2': 'SOEAIVD12B34F33062',\n",
       " '00713a7d38535de971a71a57226028b447cfcbf1': 'SOHWRJH12A8C139AFC',\n",
       " '05a0c06d80b7c4431412ec3ba2c508cf66973d85': 'SOGPBAW12A6D4F9F22',\n",
       " 'f609b66cd39d497f26b951503be10974a5b692da': 'SOGPBAW12A6D4F9F22',\n",
       " 'cf5f4ada87140d11c4dab10c2e44fe7224a21184': 'SOOHDXT12AB0181797',\n",
       " 'a67a4b3810568ae13abe3c2f34598db1da42e1d1': 'SOGPBAW12A6D4F9F22',\n",
       " '507489859d1d94ee902ff54964afdcc6b8bee836': 'SODCNEE12A6310E037',\n",
       " 'f3271d650dccb940d398940cf1bf414fd5f150c4': 'SOGPBAW12A6D4F9F22',\n",
       " 'bd11defa1a36c1fcaaec5f48c41eb91285d33151': 'SOZHUUI12A6701D7B6',\n",
       " '2dc56d748078b8940a9a6ad6cf1eecc2315d6a45': 'SOGPBAW12A6D4F9F22',\n",
       " '233723d8f008bece6a7b18237529f7fc71df13b3': 'SOGPBAW12A6D4F9F22',\n",
       " 'c3cdd2e71418ca67db23346ba329f2578332954e': 'SOBKLTU12A58A7FB77',\n",
       " '626e08b518d2330a61a76281732fbea4aa54150c': 'SOYKFFK12A8C14391D',\n",
       " 'f87e1391474294c860eb29e361cbc98ec334a9a4': 'SOVYIYI12A8C138D88',\n",
       " 'e39dc431cedf2e177692e6f5abbed19a92b96e82': 'SOHFKGU12AB01819F3',\n",
       " '50b62ef0d327e1a9a49f47bf13f1f6aa0e9623d7': 'SOISNSU12AC468C0D8',\n",
       " '51b8fbd7920f2ce9db1b59dce3a21782db661252': 'SOLAUOW12A8C13A400',\n",
       " 'cb923f6811e780465a9e99c29ba8d31cd45b0269': 'SOUMSSX12AB0182F29',\n",
       " 'ce2c7e8f60de6cebb194f4d71dd8667bb5bfe4be': 'SOISNSU12AC468C0D8',\n",
       " 'ac1185ce9708829351da6ddb0f403efbaca95f14': 'SOPFOEP12A6D4F6C3D',\n",
       " 'a48e439322a478587f72d24d8316d2df637ed89b': 'SOGPBAW12A6D4F9F22',\n",
       " '70a10ac9f5d8bc1a0ab86e0fa34019581d8c6903': 'SOXHIDK12A58A7CFB3',\n",
       " 'b4b5d3da154ce754587a0ebd1fc25491ff7276b4': 'SOBOUPA12A6D4F81F1',\n",
       " '212c6baf7beff1a1ee47980d6a0ad49946673dd7': 'SOOROCA12AF72A07D1',\n",
       " 'e3d7d494fea515688977b132345c3e8eb45b614d': 'SOCRVWC12A6310F991',\n",
       " '6a8e47197b4003be930904b57323998bee558a98': 'SONTIBS12A6D4F9CFE',\n",
       " 'ed69c8a05a2c5f7e89a624f98c9199222d74daf0': 'SOPFOEP12A6D4F6C3D',\n",
       " '9e4ea72c88a63284acc14a6142edc591a5c9be40': 'SOFTWWH12AB017AD0E',\n",
       " 'a7712c2013d31183e65a89f7fd099f2a0189ff54': 'SORJNMJ12A8C13D994',\n",
       " '06cf2a2458432897c0356418b78f82453932271b': 'SOBBKGF12A8C1311EE',\n",
       " '6c12824805e09d26ab892e0dd181154a33532e70': 'SOUMSSX12AB0182F29',\n",
       " 'f64aeaf0b8d1944c70c16b108257f4c129888207': 'SOIDEPI12A6D4F98D2',\n",
       " '81de190f5b2f004a1327d7a4bf594e220ce2f1a9': 'SOBOUPA12A6D4F81F1',\n",
       " 'a4baed7c54bd1cd2f544fd6d58494c4601eeb9b4': 'SOXHIDK12A58A7CFB3',\n",
       " 'e5d1a59f0c4b06333d9e20e6eca754b7f5253b47': 'SOSUGSC12A6D4FB0C4',\n",
       " '7dec247a6c14363a292fa31e7184cdebf6dfe96c': 'SOCRVWC12A6310F991',\n",
       " '9ad47b479086f419e621c54211c1f3fac391cf73': 'SORWLJM12A6D4F9C0C',\n",
       " 'a978d9ab581af18d6f2064e30cebc4b7328307eb': 'SOUCPUM12A81C20BC5',\n",
       " '2ba70b51448730da93032d83d282f088443c2aa4': 'SOANSPC12A6702154A',\n",
       " 'f3957397222fc917be69a40f15d743c5f80539b4': 'SOTNEEA12A6D4F7F8D',\n",
       " '418c1e0df31892251a764393a963e4ad6c2abbb9': 'SOPEFDW12AF72A1709',\n",
       " 'b161e27efcd0135dabd0cc2cfea477498667b191': 'SOUKLPY12A8C1451A8',\n",
       " '9b0764446ada33161c78f707e03803362f3985d9': 'SOIZYSO12A58A7BA28',\n",
       " '267359bf5b9d6db1758086d6d1fd8867f43423f4': 'SOHZDYL12A8C141C73',\n",
       " '1926ee9694debe859e8e918df5dddb25a61b1806': 'SOBOUPA12A6D4F81F1',\n",
       " '3c013f5abc90f29080d0ad30c4a8df3c72e9b830': 'SORWEEW12A58A7A935',\n",
       " '43be3fa6767e05bc2676e5a66292d569833748a5': 'SOYBLYP12A58A79D32',\n",
       " '7eca848d1db432573c665e19ca34bbef9e46bc2b': 'SOAMIQK12A6701D94F',\n",
       " '80209747afff5cb64e6f0444cc457e664cd054f1': 'SORWEEW12A58A7A935',\n",
       " 'db574994d6a8ce8c40c7c7c8a730722621ccc3dd': 'SOXHYVQ12AB0187949',\n",
       " '201b27e2a2984913e79fba29466cbfa7323e76b4': 'SOBBGTM12A6D4F6199',\n",
       " '3b24b6eae3612d2a5ec4119f8cababad4e8fceaa': 'SOIZYSO12A58A7BA28',\n",
       " 'f8434e514fba0d133665bf7a11fb59063840e211': 'SORWEEW12A58A7A935',\n",
       " '46c21417933522d1033596f6a57bfbff7d6d5caa': 'SOFEJPJ12A8C145455',\n",
       " 'c01f24bb69009cc7c9664fa14aa6cd09ba7d1a41': 'SOXERNH12A67AD8642',\n",
       " '394c5ac38db304a4d0690daa9df372317bab5039': 'SOBOUPA12A6D4F81F1',\n",
       " '9eb7cac272bc61d980af027825d448c4b3a74dce': 'SOYKFFK12A8C14391D',\n",
       " '024e8c95d01ca411082a1aaf861436020cc32d48': 'SOOHDXT12AB0181797',\n",
       " '83415f07bb3e172da671b554fe8a65520c40ec0f': 'SOGPBAW12A6D4F9F22',\n",
       " '4fa3f5e170fa3871aad5c16bcdbe72aa5daaa60b': 'SOXBRKW12A8C142084',\n",
       " '008483bcf336c923dc4595c5ad8582f6826f3bc8': 'SOSUGSC12A6D4FB0C4',\n",
       " 'eb7a7afbc3f05ecda323b3bf210de7d87a2c8696': 'SOISNSU12AC468C0D8',\n",
       " '695cd9df08bdd7e965f16ac6ae7d070b07f7d56c': 'SOKUFKO12AB017F75F',\n",
       " '06ecc402f4a0141c24f2a06cdc49e7e8f4ef467c': 'SOBOUPA12A6D4F81F1',\n",
       " '2a750e8fe0485b207e7aea0cf06e25b5a889de4a': 'SOKUFKO12AB017F75F',\n",
       " '4d3a8f9cbb547e84d241e374f94bad8794b79d55': 'SOPMVRA12AB01872D6',\n",
       " '93e1a44e5b1500bb7071d952441465aa2206673f': 'SOITFCH12A6D4F9478',\n",
       " 'e234b5ffa32aceb549a1cd39746c96efe6296227': 'SOYKFFK12A8C14391D',\n",
       " '0668d269fa57f8698bffef5d794e274af25458b5': 'SOYABSZ12A81C1FEAC',\n",
       " '06e508ac4cea8c8c6affbc03016371f248137258': 'SOGPBAW12A6D4F9F22',\n",
       " '198fab2dc0c0ade2a5baab75195dd504e2662a86': 'SOBKLTU12A58A7FB77',\n",
       " '9d573b10c33f1b31bd7c088a3493a111607dd813': 'SODCNEE12A6310E037',\n",
       " 'd64a1bde4e1f315bde9d87582cd4bcb58c2b5611': 'SOPFOEP12A6D4F6C3D',\n",
       " '14172590f281b916258fcb2138d4f19b8c74cab4': 'SOSGEGU12AB018188A',\n",
       " 'c46315fe8d152dfabf84e454e72fd64f9426de6e': 'SOQHOUQ12A6D4F8DA9',\n",
       " '026b5e9f40f991cda764b44d05677e696af96e78': 'SOEWPZY12A6D4FB168',\n",
       " '7c5b4cd1580567ed5ecf5157e42771cef2b7989b': 'SOIZFIO12A6310DBBE',\n",
       " '29affc3e69c44c8dd43c6b3adb98ea52ec26ec27': 'SOPGOJB12A8C13B05C',\n",
       " '3c3007802da9c23bb9d9c6137b29700c64938297': 'SOYABSZ12A81C1FEAC',\n",
       " '4696aefb769098b5426a2c038caac11d7bbf55f6': 'SOCRVWC12A6310F991',\n",
       " 'e7d4dcaa0db991bda12a6744ae8cc32f5d15c730': 'SOISNSU12AC468C0D8',\n",
       " '498dc97c1ed89eee319f33e3e297f7fcf55300fd': 'SORWEEW12A58A7A935',\n",
       " '27db13481215e467ff01d4d55e900ba22481b226': 'SOBBGTM12A6D4F6199',\n",
       " '15ac57375c08d26a3feaa27ab6b8bad8e0bd3a4c': 'SOANSPC12A6702154A',\n",
       " 'a438ce33310ecbe5526e71a64d8a2b010db581ae': 'SOFTWWH12AB017AD0E',\n",
       " '54b450ff0a6de8928c60a2b12eaa80e94046d40b': 'SOVWHPM12AB017DABB',\n",
       " 'eb8fca2d3193de5a8926e6d5d150b6f40dc2cf15': 'SOAMIQK12A6701D94F',\n",
       " '982eba95d4e2d49f1d925b4be1998ff9b365af77': 'SOBMKJU12A6D4F7128',\n",
       " 'a8b3ce387ead1428d0da3aac26f65525c513039d': 'SOFEJPJ12A8C145455',\n",
       " 'a1ad5b740e9dd0392f350dc7b656cddb63274330': 'SOKZZGT12A67ADA4C3',\n",
       " 'd20ba52fe1b9513d536c63f98ccdf9aafd196b1e': 'SOHWRJH12A8C139AFC',\n",
       " '327b260bf73efabe692fec958a7c0aed43d45379': 'SOFEJPJ12A8C145455',\n",
       " 'b9aa87b07cd01392c1117e7d4f6e277208c6803a': 'SOXHIDK12A58A7CFB3',\n",
       " '616d0c166faa761ab369deb65b2b1983fb64f5c6': 'SOOEQXL12AAF3B4D73',\n",
       " 'cf38670dda801e9258ab3043706a4784253d4ae4': 'SOBBGTM12A6D4F6199',\n",
       " '5b9efd167e61db995d7922743d09b704af72e726': 'SOHWXEU12A8C1320D1',\n",
       " 'e654d1f65af2ac6e0f152d0dcf56e5aac7bbf20f': 'SOISNSU12AC468C0D8',\n",
       " '9785676e8b8e5a51a5d2591767782e1e5475bdf9': 'SOAMIQK12A6701D94F',\n",
       " '98370bf22f1a0c4ca09fd73713d2c440b2c1c50b': 'SOXHIDK12A58A7CFB3',\n",
       " '6c11d347e455201bfb2759c8f5d86f43aee15fef': 'SONIPQC12AB017B595',\n",
       " 'f469b6e2f140396d7da5f7d2744d90a611e26ae5': 'SOEAIVD12B34F33062',\n",
       " 'e318826c226a50bb80801f8e1c6c477b027da651': 'SOZHUUI12A6701D7B6',\n",
       " 'fc4784391d14206be87622b575555296bb0f77a5': 'SOEWPZY12A6D4FB168',\n",
       " 'a45fe7de6cb1208e8cd58ae12e87fe01f7ad91ff': 'SOTFJGS12AB017F577',\n",
       " 'fb59a48b90ef3760f09b876391e5a06c7a1e15bd': 'SOCMNRG12AB0189D3F',\n",
       " 'de556e106b2ca0fefbcecec6bff6423ecc77e4a4': 'SOKAESA12A8C1410A1',\n",
       " '8b73a74377e6b532ac7adf755d6499a560ee98e5': 'SOUMSSX12AB0182F29',\n",
       " '8360742b8bf4d68d9cb90b62b98e4a12e2b5df66': 'SODYAQG12A6D4FD15C',\n",
       " '2ed8399a868c550bfcc4d3d7913d65733ca0c459': 'SOQHOUQ12A6D4F8DA9',\n",
       " '3566b5f86d607bdfa9f46b260bc99cfc0c293219': 'SORJNMJ12A8C13D994',\n",
       " '211d60ad11d15e36ea45901b4e33affdcd8ac4f6': 'SOAMIQK12A6701D94F',\n",
       " '880e620ea1656b3a3d03b07bce5b72300d24b4d0': 'SOLAUOW12A8C13A400',\n",
       " '8da002bce92ba12720eaa2344df49880971adce9': 'SOFTWWH12AB017AD0E',\n",
       " 'f2d35644ee475c297ff22933de8c70a95670a8da': 'SOPUSNZ12A6D4F9684',\n",
       " '8e9422a8bc761a69e3ed40a225442e76d0369a61': 'SOZHUUI12A6701D7B6',\n",
       " '29480906512f04b629f54e520d0da1352e46a450': 'SOISNSU12AC468C0D8',\n",
       " '9b0ef5c64095b21a2c7a921ec07ac188bb149412': 'SOYABSZ12A81C1FEAC',\n",
       " 'ae1f305886e340017e31b00395ca621ab00aa676': 'SOBOUPA12A6D4F81F1',\n",
       " '96f9b6cb348befc7aa9ad4168aeba0f8a85e9a3e': 'SOAMIQK12A6701D94F',\n",
       " 'a38227909a3acfcf867d440eb3fff17f5de36d4f': 'SODPPDY12AB017F767',\n",
       " '7ee638348841a2a5e3cad2e2685a2d0bcfc735e2': 'SOICRPT12A8C13190A',\n",
       " '323e0c2f2603139ecc78cbcfc12675ca788b4beb': 'SOICRPT12A8C13190A',\n",
       " 'b7b5b89e78a491e6c6b1910a97980890b5606840': 'SOKZZGT12A67ADA4C3',\n",
       " '5b66d6dc15c418c9f9b19ac85722648df94b6b97': 'SOISNSU12AC468C0D8',\n",
       " 'ab5bbad9e2ea56695ccf1d629f4c75a3351814f9': 'SOXHIDK12A58A7CFB3',\n",
       " 'fe63e13a67442bf991c3389daefd5c289c7fea83': 'SOOROCA12AF72A07D1',\n",
       " 'a75adcd45c32ded2c9825b81e3ac110ee508e8c0': 'SOEAIVD12B34F33062',\n",
       " '1923c9456e685c909c2e82355e9f35e3652b29f4': 'SOYABSZ12A81C1FEAC',\n",
       " '5a56ebdcf8b235bc70e87f7eb16fc8dd8dfbb7ae': 'SOUKLPY12A8C1451A8',\n",
       " '72c3c6ea959d444992747272102c3521ccde18be': 'SOAMIQK12A6701D94F',\n",
       " '6c5a092c7990830f9a18f0971258d529529bbec7': 'SOTJSCD12A8C14093B',\n",
       " '4e1012002b435f71a6c9211e4bd2a0ebc00bb121': 'SOVYIYI12A8C138D88',\n",
       " '3e5c28bd7228ea6a515af35d917506105c5c5134': 'SOISNSU12AC468C0D8',\n",
       " 'aefbe602529e4c30a9eea0f12b56ca20b1e6dc7c': 'SOLAUOW12A8C13A400',\n",
       " 'f65513893d4eb21d66b63af533ef7d34d7faebbb': 'SOJEHJV12A6D223C0C',\n",
       " '756f22f86c8a4b4443d65d44f468bd0b6a8653cd': 'SOXHIDK12A58A7CFB3',\n",
       " 'a52e913b0c7ea13a9ecb58da7a5171d5c0c9997a': 'SOUKLPY12A8C1451A8',\n",
       " 'cbedf388b6df6b6f839fdf65079e611ca96254b6': 'SOPCQRT12A8C13B15D',\n",
       " '96f7b4f800cafef33eae71a6bc44f7139f63cd7a': 'SOJHCOH12A8AE45F4F',\n",
       " 'ea37595e65aa2ce50a250373f2f0f083ee92032a': 'SOKZZGT12A67ADA4C3',\n",
       " '80570ddd617f1b7c3731b4e2fabf0d5d12d4d243': 'SOGPBAW12A6D4F9F22',\n",
       " '81fb7f3d2dde170e8d614a71f9a3ed3ea9e85e0b': 'SOXERNH12A67AD8642',\n",
       " 'e01458d49fe2cff0168f1fdaaa0d51f4bdafbacd': 'SOLAUOW12A8C13A400',\n",
       " 'd61c4bfdae7e3a2bc4c3cb025d0866259cfd3bc2': 'SOXHYVQ12AB0187949',\n",
       " 'f26d9d04c8078981cd0c093672433e57f09e9bde': 'SOZHUUI12A6701D7B6',\n",
       " 'b7686bb4223ce6decf654e88f78d3bfe4b76246b': 'SOLAUOW12A8C13A400',\n",
       " 'eea8df6b4d7c06d1628e3d4cdd4f7c2ffadcffae': 'SONTIBS12A6D4F9CFE',\n",
       " '425b84585baf074aef47d8250e33651769efedd6': 'SONIPQC12AB017B595',\n",
       " 'ce4eb9641c53a7286215ef90e1d5add226c8b752': 'SOLAUOW12A8C13A400',\n",
       " '8cc64faca6d55852354e90a7b2defce36c182014': 'SOXNZUH12AB018393F',\n",
       " 'd9ce33363a5535b63dadbcf5bc44c735a98080c9': 'SOAMIQK12A6701D94F',\n",
       " 'fa9e12bb400edccad658edb15987cf9dd19e6aa8': 'SOIDEPI12A6D4F98D2',\n",
       " '28615c80b426145bb4779caa519dfdf10464ad87': 'SOISNSU12AC468C0D8',\n",
       " '0e44e5cad7c6fab7c7aa593dc61cdcaf44f20b3f': 'SOCHKWF12A58A7C9B7',\n",
       " 'e151c8a87aa75e7f0cd3cfdea19edb3c13dd4e69': 'SOXHIDK12A58A7CFB3',\n",
       " '050199757f323eee50c5f8d3d3a5bd0d48ea0ca9': 'SOISNSU12AC468C0D8',\n",
       " 'b50dbda8627c251e4d56d32cf9ad31983146b24b': 'SOBBGTM12A6D4F6199',\n",
       " 'debe08f51aa7e61ff16411e38135bb8f5d725a90': 'SOPCQRT12A8C13B15D',\n",
       " 'e037f60e0656dfbff77768f8f68276bdad868121': 'SOBOUPA12A6D4F81F1',\n",
       " '49d40bf3dd3082069ac9f333b516e544223695c5': 'SOFTWWH12AB017AD0E',\n",
       " 'a7bc0c68828d36590f686f0b85ae9a30f088eb16': 'SOTJSCD12A8C14093B',\n",
       " 'ff256e9b5b71a500e438d0e44397ab0fd7c0f88e': 'SOBOUPA12A6D4F81F1',\n",
       " 'df89225ab282429b82f21652ed70a35e1db3cfaa': 'SOISNSU12AC468C0D8',\n",
       " '379e0734f603774e0be609b111d4aad69bc8168f': 'SOSUGSC12A6D4FB0C4',\n",
       " 'c64e7fb2badfc5cddca30ad061ea2fe3be71e73a': 'SOBBKGF12A8C1311EE',\n",
       " 'f8f405c9935219318b4bbc7d716ab1b3e64b0021': 'SOXHIDK12A58A7CFB3',\n",
       " '9a7098270012eb04fba290c324d0c272602cb2c3': 'SOXERNH12A67AD8642',\n",
       " '45dbf380f5e0133c130d503cadda1ab87797e9d9': 'SOPCQRT12A8C13B15D',\n",
       " '8ee5b88ad17607d962a32c11cf3c453908a8d6f6': 'SOKZZGT12A67ADA4C3',\n",
       " '7c4d049e52f877532bde0a837f475b73bb31f598': 'SOFEJPJ12A8C145455',\n",
       " '5e6c0ca846d24232800d472eaef176cbce51d2a0': 'SOBOUPA12A6D4F81F1',\n",
       " 'a92f4dffe72b2f9e74930dceaa8e9f89955ecf05': 'SOTJSCD12A8C14093B',\n",
       " '56c6947a7e1a536844b05163a347e8091c6b346c': 'SOFTWWH12AB017AD0E',\n",
       " '8e23e8c00a6f48cc69a0d1b8f9cce674de86c478': 'SOJEHJV12A6D223C0C',\n",
       " 'bc76e5f9b1aaac0fea550468c7acfece9c40ada9': 'SOZHUUI12A6701D7B6',\n",
       " '5d7df3e70731b2b3b424d99f3225ca0c1e2b8ae8': 'SOJSGZT12A58A7E75C',\n",
       " 'e817f6d53c88800b295bbc6a9087987e8a37a797': 'SOIDEPI12A6D4F98D2',\n",
       " '2f3e2b0ade854f990ae61833345b6381566544be': 'SOBBGTM12A6D4F6199',\n",
       " '96b4b2d07c2e0b5df96d236b8cf87cb5378b792d': 'SOXNZUH12AB018393F',\n",
       " '2e25eafeb79f9e74d7a6a20cfd991ba789968feb': 'SOBKLTU12A58A7FB77',\n",
       " 'e5a9384b60929da8393e80226723aa3855454e3a': 'SOBBKGF12A8C1311EE',\n",
       " 'fa5998c0a2336e76482ed28a55ac52b717a7e664': 'SOUKLPY12A8C1451A8',\n",
       " '7afa4c5f70bfc4e8f75c1936bce6d52493d6d082': 'SOXHYVQ12AB0187949',\n",
       " 'd36bead489a4e626d069fc006285ba545108c247': 'SOBOUPA12A6D4F81F1',\n",
       " '96524a1edfdffea5445df54017ee50333be7a0be': 'SOUKLPY12A8C1451A8',\n",
       " 'cd8be5ad4da057a844b81a0809b37addf68f4593': 'SONIPQC12AB017B595',\n",
       " '8b965676346e269a87ffef21b553f9df96138a02': 'SOICRPT12A8C13190A',\n",
       " '59919e2d87b1f062b7d86f7fa3513a637d59902c': 'SOANSPC12A6702154A',\n",
       " '758387bcc56556d5bc1dc66c0c4ae55805b40f6b': 'SOISNSU12AC468C0D8',\n",
       " 'd285de88e997e60ce1e30651e07cd6c89dc04232': 'SOGPBAW12A6D4F9F22',\n",
       " '94d3bbb4a0629eed51c3a911cfdc2cc5cc5c0bfa': 'SOCQOZB12AB0185685',\n",
       " 'de3d5c9168be2d2d9d27a1acc3dc5cda252f1f0e': 'SOIDEPI12A6D4F98D2',\n",
       " '690ea864f62416a197819e7969d94a1204c17e63': 'SOISNSU12AC468C0D8',\n",
       " 'f13925c858a29c885c90fbb9b0c3592f592fad29': 'SOCRVWC12A6310F991',\n",
       " '84d97c4e8b6187a5952c9ff2a378bc3214dc0a83': 'SOYKKZP12A6D4F78D0',\n",
       " '19b1c34ac3e82be16c99c54e243aee4f8c132a05': 'SOGPBAW12A6D4F9F22',\n",
       " '4be305e02f4e72dad1b8ac78e630403543bab994': 'SOHWXEU12A8C1320D1',\n",
       " '79fdde575abfdec51912fb95d4b9f856efb3d798': 'SORWLJM12A6D4F9C0C',\n",
       " '9c46276e5ffa013d4b68f346d87d325d18ffad06': 'SOUMSSX12AB0182F29',\n",
       " 'd3c258529ac77c904308f35391566e8df37c369f': 'SOITFCH12A6D4F9478',\n",
       " '83fffcce21cf84a6ac30e65e06de8a264a89050d': 'SOPCQRT12A8C13B15D',\n",
       " '1154226d04db38bc3b175cb7673189916a06ffcf': 'SOGPBAW12A6D4F9F22',\n",
       " 'b1f3c259cb11b0f38b3afd465be522b7474c9347': 'SODCNEE12A6310E037',\n",
       " '187870c7392012fc876ddddbff147df9a3d0b659': 'SOICRPT12A8C13190A',\n",
       " 'fb0095766315d9fdb996f7dd508c1a225fd36e76': 'SOBOUPA12A6D4F81F1',\n",
       " 'b7e8f461c82d8fa5306ccfe305bbc1eaf20038e2': 'SOGPBAW12A6D4F9F22',\n",
       " 'cf4b9ae41a11c22597e387a0ab942a1a535493b6': 'SOBOUPA12A6D4F81F1',\n",
       " '9b38f6add16a36622afb1170702203119fc9fc86': 'SORWEEW12A58A7A935',\n",
       " 'e4c05157f8cebdf3b9d689c441ba97c5ed5db05b': 'SOGPBAW12A6D4F9F22',\n",
       " '265085022d1e58d2fa6751f999b3c9e934ca992f': 'SOFTWWH12AB017AD0E',\n",
       " 'd41336c9ecae1595f8919e5b112f37a2696bd256': 'SOPMVRA12AB01872D6',\n",
       " 'ba170cbc329ba65e5ff5db757f3065edf53d50b1': 'SOBOUPA12A6D4F81F1',\n",
       " '3aa1405a5c67ae3a898877d13deb7e8116778ae8': 'SOVXSZO12A8C13FD2C',\n",
       " '8a95f72004dfa43cd5b127c1ef5275f9c71c9584': 'SOQHOUQ12A6D4F8DA9',\n",
       " '6a003fd439cdc0f72cb8d135f92338db7ec6636f': 'SOISNSU12AC468C0D8',\n",
       " 'd739a54232200f53bff604468c69fdd58a99e2bd': 'SOXNZUH12AB018393F',\n",
       " '0626babd8b8eca95c7c0c205de5ec973a58cf5b2': 'SOZHUUI12A6701D7B6',\n",
       " '6f8daf006fde2856d25911c9c0ffe83f1a46bc7a': 'SOVWHPM12AB017DABB',\n",
       " 'd77ae65038759a9d213b82b4190da491d2c307d6': 'SOVWHPM12AB017DABB',\n",
       " 'fa243a761e43be534e04ce6b30097438138afc33': 'SOCHWPT12AB0184F15',\n",
       " '41cfe870cf7d1c79f170c72dc67ab6e348094452': 'SOJHCOH12A8AE45F4F',\n",
       " 'f119cabeb6ac4a9a9c3f2e02dd004f185c8e0121': 'SOGPBAW12A6D4F9F22',\n",
       " '5d0de97a42e2e72b08d3700e3145a349e778b91b': 'SOBOUPA12A6D4F81F1',\n",
       " '6c3fad51383cbf6534126cd239f4e88af5c24758': 'SOBBKGF12A8C1311EE',\n",
       " 'f6db55aa2e26727c6d73b950f1cc6eda2d4571f9': 'SOPGOJB12A8C13B05C',\n",
       " '458f60aaa192d29b92f071c3379633d93f85f761': 'SOISNSU12AC468C0D8',\n",
       " '98fe95d4ca81580e65f6f6eae0003cde749370db': 'SOISNSU12AC468C0D8',\n",
       " '81098dd9f916c25ef2f9c999c68e930e1b0d2239': 'SOOROCA12AF72A07D1',\n",
       " 'eb39de5a97aab89994d0a4c6c51270bea96562fc': 'SODCNEE12A6310E037',\n",
       " '6c6a253ed90804bb9f72892c65835d83dacdc54d': 'SOYKKZP12A6D4F78D0',\n",
       " '185f0ea07201ac49ddf1c0e15828d5552fbe55ee': 'SODCNEE12A6310E037',\n",
       " '9c19b983a1ca57acb60606eec940125d83f31724': 'SOHFKGU12AB01819F3',\n",
       " '3f514cf0a0100f126a94eaacfe5d8971e294ccf8': 'SOHWRJH12A8C139AFC',\n",
       " '302e94a5e193a8d60c617b29bdaa0a7f235dbac2': 'SOZHUUI12A6701D7B6',\n",
       " '6bdefd18222364636a86709ddd43c80344a99513': 'SOBOUPA12A6D4F81F1',\n",
       " '94a689adeeb8679b4b81bdf701cd9c58efd2a414': 'SOAMIQK12A6701D94F',\n",
       " 'da07642ac1f84735f9bccfc9a9a58d70c8babb5a': 'SOXERNH12A67AD8642',\n",
       " 'abe38af8221219659455ee3f148aa67bd0c20e12': 'SOPCQRT12A8C13B15D',\n",
       " '1acbfacde38c1a5332d1109f4d9e0e88296f61db': 'SOCHKWF12A58A7C9B7',\n",
       " '94246274309f83d43264045d218e57c4cbdcc7c6': 'SOISNSU12AC468C0D8',\n",
       " '1db54e9cf9c903682f0da48a82da82384b784522': 'SOFTWWH12AB017AD0E',\n",
       " '0459bf64e769b9ee1afd1f6c2677d367099cd894': 'SOISNSU12AC468C0D8',\n",
       " '7f378eb82733fe2975efa4acf82f94a87ac6f8c6': 'SOGPBAW12A6D4F9F22',\n",
       " 'c70e36ca3bb8a2d19db87f43daf46a8027a4d69f': 'SOBOUPA12A6D4F81F1',\n",
       " 'd8b561e19b4c2ecf8f90e0da38cee7cbcebdb030': 'SOPCQRT12A8C13B15D',\n",
       " '31c43558ab35edc7130ba8410c6d5d4f354a7aaa': 'SOISNSU12AC468C0D8',\n",
       " 'ddb8828ddf540b341cc23d0b21f2a2e1567477ab': 'SOUCPUM12A81C20BC5',\n",
       " 'eabfe338a9b7ef428f367ed4e6fd37b660f26be9': 'SOBMKJU12A6D4F7128',\n",
       " '6c8590b00f0e84f19579eceb58b6281dad15f74b': 'SOIZYSO12A58A7BA28',\n",
       " '955398cde72bdc3a70c737563a2f9a97ab7f5bf5': 'SOJHCOH12A8AE45F4F',\n",
       " 'c1ddd26b9e82845db257144ab34244c6b4a2d02a': 'SOBOUPA12A6D4F81F1',\n",
       " 'dffb49abf227e596e6d2b7fc03eeb107315ecdaa': 'SOISNSU12AC468C0D8',\n",
       " 'f0f59e3d697c98e7f75bb6fa29bd1182bd15a3f6': 'SOLAUOW12A8C13A400',\n",
       " 'f780c2eed93d1000d3f19fc4acaea2e7cde75b7c': 'SOTNEEA12A6D4F7F8D',\n",
       " '51276f7d93637d356e07b0eec8427556afe21f22': 'SOXERNH12A67AD8642',\n",
       " '59356111ef24437e6d84b9e3f7818be3106ffdb2': 'SOCBQKE12AB018548E',\n",
       " '95cb0200f4511f8a216f2a0b8881bec79d398db9': 'SOXHIDK12A58A7CFB3',\n",
       " '970fcacd94b712325ebb4ddb66fba58af4de90de': 'SOFTWWH12AB017AD0E',\n",
       " 'fb9a37b5b1b8e3d171770b2cea1ca5bf39ecef69': 'SOBBGTM12A6D4F6199',\n",
       " 'ccd679116d1e9b70e66a39b0e22517ca0dcf7fc5': 'SOCBQKE12AB018548E',\n",
       " 'ce1d7e75dca684a3be711c37343379f4817ee31e': 'SOAMIQK12A6701D94F',\n",
       " '02f0a37e76736a0415a9e2dfabfacbc4e8d916e4': 'SOUKLPY12A8C1451A8',\n",
       " 'dda447e794d8569d68e65ddf6be9d68f54327a9c': 'SOGPBAW12A6D4F9F22',\n",
       " '25d41c1e8ed6dfc90b6df0aea81f545c2c123340': 'SOCMNRG12AB0189D3F',\n",
       " 'cd56f2b8c995e9f5e354ef07f1814a3ab67b9faf': 'SOYKKZP12A6D4F78D0',\n",
       " 'a028b3e41c89e5fad28369d9b35c0aa38db3122f': 'SOKZZGT12A67ADA4C3',\n",
       " '91f041cae31a6ca6b9756042d5756d786f823a33': 'SOBOUPA12A6D4F81F1',\n",
       " '08257b6175955cdd4b51574e093003921fa5a03b': 'SOANSPC12A6702154A',\n",
       " 'ff6b6619a334a4489beb608266e4b9ff5ff86d23': 'SOSMXVH12A58A7CA6C',\n",
       " 'af6a30093836e16efea5da1c9f3662e917cbbca5': 'SOOHDXT12AB0181797',\n",
       " '212604727d2859227b792b4b9e221fce5090448a': 'SOBBGTM12A6D4F6199',\n",
       " '904cf8aead1e4f51edef6fe0a05a6ef0c7dc9a4b': 'SOZHUUI12A6701D7B6',\n",
       " '3fe7a69097469188e3803a7a64c2f334bab87330': 'SOBMKJU12A6D4F7128',\n",
       " '45d107becd67c094ebe7a19e70a885dd5e0da6e2': 'SOXNZUH12AB018393F',\n",
       " '1d227eb2c918fa892c085e8c3b906849a7bcde3e': 'SOAMIQK12A6701D94F',\n",
       " '959019853371f109bb61c6e76a974569788a1ae0': 'SOCHKWF12A58A7C9B7',\n",
       " 'bc797a0a771d1b5828a8bdb2129fc4415c168b4e': 'SOANSPC12A6702154A',\n",
       " '0e6a5fcae5d537b88e763a5763efdb03f87fcf32': 'SOGPBAW12A6D4F9F22',\n",
       " '2b10fd70a7e1c2e51ebd49fec60565c251f4e802': 'SOBOUPA12A6D4F81F1',\n",
       " 'ac1b9de22e8dc24bd3951494e373996c452995a8': 'SOKAESA12A8C1410A1',\n",
       " '388b45eaac40552d006a06a03f193dbf51001f08': 'SOAMIQK12A6701D94F',\n",
       " '7a947a2b066e6bbd648b0376c712b48138738212': 'SOBOUPA12A6D4F81F1',\n",
       " 'bbaa3916f631c5a85baf3b4ccd6fe9bf48bfdceb': 'SOIDEPI12A6D4F98D2',\n",
       " '0734679a3bf959ce2ff1e5d620339b5b0f271072': 'SOAMIQK12A6701D94F',\n",
       " 'd64a4c5c014112bf460a445fb688eb7851d255a6': 'SOIDEPI12A6D4F98D2',\n",
       " '9ff5b97655c42065ee682e6af8edc5c1613c827d': 'SOJHCOH12A8AE45F4F',\n",
       " 'c97a2cd394411418d1efed1e16941007080f5480': 'SOZHUUI12A6701D7B6',\n",
       " '50d29b089a7cf643189da854df22592bee920616': 'SOLAUOW12A8C13A400',\n",
       " '8eca663c87d1afe5fd3add620477ba71aad74190': 'SOGPBAW12A6D4F9F22',\n",
       " '167d7ae1b565cd7c5134bf5b9f4c94384d6af569': 'SOBMKJU12A6D4F7128',\n",
       " 'b94f5d2c985a9368ed1ad5e792475b038a121a84': 'SOGPBAW12A6D4F9F22',\n",
       " '4a272f674d2668f392c7caf87df66e26f9b12063': 'SODYAQG12A6D4FD15C',\n",
       " 'b98e6c35a55759accedfd92723543dead29354fa': 'SOISNSU12AC468C0D8',\n",
       " '4d9fd735d6e9c44e548cac42d554bd2ff41927e3': 'SOBOUPA12A6D4F81F1',\n",
       " '79e134fdea7fc5c0942ea7738c8d956004a470e3': 'SOPGOJB12A8C13B05C',\n",
       " '37ceb2d930ac42223a1b057cce7df63d7a726b42': 'SOBOUPA12A6D4F81F1',\n",
       " '89032cb727bcf19ec0f935d3a04641e8fdd0e250': 'SOBMKJU12A6D4F7128',\n",
       " '06b758cead6ff2be087cadc3395bc0afd3a83490': 'SOJHCOH12A8AE45F4F',\n",
       " 'bc6ecf0db62515bb90a1c90004f63c030347d854': 'SOISNSU12AC468C0D8',\n",
       " '410e73ca5796381910ddcaac79fd549231bba3ca': 'SOBOUPA12A6D4F81F1',\n",
       " '13ac3bd7d1cdf380b84d2be752264490afb23d1b': 'SOBBKGF12A8C1311EE',\n",
       " '887c805ca84e503dce6244cac6e0d0bbb64d42b6': 'SOTNEEA12A6D4F7F8D',\n",
       " '0b60fe0a87274de4b47e6854e2c3b63802c54a3c': 'SORWEEW12A58A7A935',\n",
       " 'f46a81f758c5f515bd10dbe6962043ae628065c6': 'SOGPBAW12A6D4F9F22',\n",
       " '3029eb462b399a8aa7472ed48cc51ce8fe8f5c7d': 'SOJHCOH12A8AE45F4F',\n",
       " '6c8c160c250f3a689e2f7fe87b7152de998f705d': 'SOXNZUH12AB018393F',\n",
       " '07afea8ceb7a1cd637dbef1e4d6713bd92c4eded': 'SODPPDY12AB017F767',\n",
       " 'a4a94569ace735e8e378b46662e7dae643373b5f': 'SOISNSU12AC468C0D8',\n",
       " '3618eec49a0cc0ae5bb16dbc637fe266026ff358': 'SOIDEPI12A6D4F98D2',\n",
       " '3c970df9adc1ebd5f717cc888d61b8087800459c': 'SOISNSU12AC468C0D8',\n",
       " 'aeb139c281038af794f6a15bb3d496a4eb5ec2c1': 'SODPPDY12AB017F767',\n",
       " '8f8a2009d4376f3a3a47cc955b3cf89a6e1525c6': 'SOZHUUI12A6701D7B6',\n",
       " '5a98fb5d15ee2c24a318dc3c8de5c54571c19699': 'SOBKLTU12A58A7FB77',\n",
       " '47b3060ad0daebacaaf77d6263f8c8f02d3136e9': 'SOJHCOH12A8AE45F4F',\n",
       " '5615baa5d58c442fcb545bac81098dc1fe78f864': 'SOGPBAW12A6D4F9F22',\n",
       " 'a4dd4ecb1fe6c2fa0ac747ffe3d871c0e06f99ba': 'SOCHKWF12A58A7C9B7',\n",
       " '7ed248459e537551f0e04d6a2703e9ff70f532a5': 'SOANSPC12A6702154A',\n",
       " '7fe3fd71eab8c61cd00c173e35ee3339d38b517a': 'SOYABSZ12A81C1FEAC',\n",
       " '5e3925341ba0b3d0de6203b3519a4da852c6a6a8': 'SOIDEPI12A6D4F98D2',\n",
       " '7673653e28ed27a87d5407fd684a43c5b04ae1d8': 'SOISNSU12AC468C0D8',\n",
       " 'a8f7f40f3961a4f3897d1e00eb91616d176b4757': 'SOSUGSC12A6D4FB0C4',\n",
       " '6ed1cd848678d774e0c46f76d0cbbe45e7e6b4cd': 'SOGPBAW12A6D4F9F22',\n",
       " '35cc1a4e3b28578e2fc9204cf26422db96cb138d': 'SOCBQKE12AB018548E',\n",
       " 'bf0185a59da607c33c5b08c1fd27ce752720a85b': 'SOHWXEU12A8C1320D1',\n",
       " '103ee21d642c7dbcdd836b3bf5bf114f08953a89': 'SOQXDXM12A8C134E8E',\n",
       " 'e328a1b0c243a663cab705ad0b12d2a9f72dc651': 'SOPCQRT12A8C13B15D',\n",
       " 'bb203747a7780502b32af941ac06f09904fe1f34': 'SOBOUPA12A6D4F81F1',\n",
       " 'e466da0493290d3bc800e577b2732e9ae3e40d99': 'SOISNSU12AC468C0D8',\n",
       " '4e3e415712906b970d906cb0e5dc898ad01fe34a': 'SOITFCH12A6D4F9478',\n",
       " '0a1c3decace722a881e6ac4a2437904e7e4a1b56': 'SOUBKFT12A6701F07A',\n",
       " 'e4aaa9091c2ef29ca04f011667149d745671fa6a': 'SOSMXVH12A58A7CA6C',\n",
       " '156aae3465c5149824180b17b5a3e7e0f54fc2aa': 'SOBOUPA12A6D4F81F1',\n",
       " 'c3a9755e3ddb8ac6867f8dae1da986be20d07665': 'SOPCQRT12A8C13B15D',\n",
       " '01c3dfa049b60ab72a0b2b8f1e3415ce65a2c38e': 'SOTJSCD12A8C14093B',\n",
       " '77bb956470187988009c07ba9d8a74303657535a': 'SOOHDXT12AB0181797',\n",
       " '94c23e7a32a8624853357573dfc8a8d9bb7b9b0d': 'SOAMIQK12A6701D94F',\n",
       " '77af9e1893d3e4f6cb3a428a059b23a871258232': 'SOKZZGT12A67ADA4C3',\n",
       " 'a1eca3d453470fe52c736e62a87daaba41478d0c': 'SOBBGTM12A6D4F6199',\n",
       " '6874a0155ebe61b8e33169bb14157981bbe16c44': 'SOBKLTU12A58A7FB77',\n",
       " '8afe2afb6fa4c88f4a4f53e37b3960a8ec971a51': 'SOYBLYP12A58A79D32',\n",
       " '3feaabbec399de1719d4061b9497cb03ee459a9f': 'SOHWRJH12A8C139AFC',\n",
       " 'f65f620a516babfb85e603968aa2df2d7244a2f0': 'SORWEEW12A58A7A935',\n",
       " '9acab3cc2d02278c221b9285ed8f05438e3b6280': 'SOBBKGF12A8C1311EE',\n",
       " 'ce2ec620a1a0c4befedc6022960469fb2f131a6d': 'SOISNSU12AC468C0D8',\n",
       " '366f0609ca2854fa5cd7101c7823c0afd9458272': 'SOYABSZ12A81C1FEAC',\n",
       " 'b7032f457c624e23113c39b2f9c444a961c3fdf8': 'SOBBKGF12A8C1311EE',\n",
       " '96bd3de742bb352452eb7ae70524e7ba85add4bd': 'SOXBRKW12A8C142084',\n",
       " '989ff9239b09b765a0b5cedef4aec97495ee3a1a': 'SONTIBS12A6D4F9CFE',\n",
       " '4aeb17064fb39ca6b6befb9a481d8f5da34baea7': 'SOYSWHI12AAA8C5BFD',\n",
       " '7f2ef684d889ae8fe94ed2693bf25aad5efc8182': 'SOISNSU12AC468C0D8',\n",
       " '3805ba143b074763571eabb6e037b98131c9d883': 'SOGPBAW12A6D4F9F22',\n",
       " 'cc943ff786afa1e9d547d95bad7a1b5988bbaa0f': 'SOGPBAW12A6D4F9F22',\n",
       " '9e25c950b2f4836c327d096a5f877119b152343d': 'SOBOUPA12A6D4F81F1',\n",
       " '7d3df854dab8d146decc6ae1352cb29694254eaf': 'SOBOUPA12A6D4F81F1',\n",
       " '1cb4325f8f021cca99fa2970ab64e25a7e03da23': 'SOPCQRT12A8C13B15D',\n",
       " 'da43a042a07ba123b08ff9d1744fc72ceddbf385': 'SOJEHJV12A6D223C0C',\n",
       " 'd9db19d9ba0b69d42c9ab567c458754f356a60d8': 'SOHWRJH12A8C139AFC',\n",
       " '7a055048ae7b4bbcf776c412f8bbee56f5bf1ec5': 'SOCMNRG12AB0189D3F',\n",
       " '7e89a43dc229de4259b5a36053de255a6247a773': 'SOPGOJB12A8C13B05C',\n",
       " 'a5e0efda8496effed37a844fc372a152e6b1de43': 'SOLAUOW12A8C13A400',\n",
       " '22e5ed90a4357bec0460c8e4e44eb6d2ff518c9e': 'SOLAUOW12A8C13A400',\n",
       " 'f5d82d821c074b7efb720977301a256a099aa370': 'SOYABSZ12A81C1FEAC',\n",
       " '0eefbf6157eea1180a76e6980d07baf3f7c307c5': 'SOICRPT12A8C13190A',\n",
       " 'a974fc428825ed071281302d6976f59bfa95fe7e': 'SORWBEB12A58A78BF8',\n",
       " 'e8e5a743247bb455a01cd65d6015a6dfbe2b36b9': 'SOPGOJB12A8C13B05C',\n",
       " 'd83d961366c8ca18d82f208946161d0969c27b5c': 'SOBBKGF12A8C1311EE',\n",
       " '15a4f527f3f523d3c080b15390178d9d8c930d7f': 'SOAMIQK12A6701D94F',\n",
       " '5dd2d021dd3e955f0dfaaff834849ca142d0313d': 'SOEWPZY12A6D4FB168',\n",
       " 'a2b64c98ba993759716175eeea0277156ea86c00': 'SOIDEPI12A6D4F98D2',\n",
       " '00c8b713d9e577adda0bbec0cdbb5d62f4c0d313': 'SOHFKGU12AB01819F3',\n",
       " '7e8d841b07eb5e7c3fec1efffb31e6b38f0bebf3': 'SOHWXEU12A8C1320D1',\n",
       " '5efabb15a54f3f211bb07043926d2c7756a12ff7': 'SOQHOUQ12A6D4F8DA9',\n",
       " '2fa49e89103954b5abf92320089ea3573eff6d51': 'SOOROCA12AF72A07D1',\n",
       " 'eb28826570a431f1519b854325a964bc5acf8b94': 'SOBOUPA12A6D4F81F1',\n",
       " '0f39a0347e02232bf63f041ca25c05b0ff489329': 'SOBOUPA12A6D4F81F1',\n",
       " '34b725f631704e55a958ee7f5ef7c8b169406fcf': 'SOOHDXT12AB0181797',\n",
       " 'ecf224230bf6205a8cf661a3ae6422b11f744981': 'SOOHDXT12AB0181797',\n",
       " '786ef21a900d1075415f85c5fa4f410e0bbae3c1': 'SOBOUPA12A6D4F81F1',\n",
       " 'd28a4ab629fe9b547e72dce0dd10c50b5c49c69e': 'SOUKLPY12A8C1451A8',\n",
       " '04cfd901ac0eabb9d53f3f6480d9a08eb281b4ce': 'SOBOUPA12A6D4F81F1',\n",
       " 'c27ce09485e1f2f6e56f6329a786b74156af6ccc': 'SOPGOJB12A8C13B05C',\n",
       " 'c97a961432c0409c882544fd663f5c172d02357d': 'SOGPBAW12A6D4F9F22',\n",
       " 'd6b68d47036a094896c68fff7c1244d43f811ea7': 'SOFTWWH12AB017AD0E',\n",
       " '364efea2d79984f9bf31be289d619f0fe3f43413': 'SORWLJM12A6D4F9C0C',\n",
       " '86579d4623869aa8c540db32e1114aef98650686': 'SONTIBS12A6D4F9CFE',\n",
       " '47fcb3b59475f657572b339ff9fed4d690da931e': 'SOIDEPI12A6D4F98D2',\n",
       " '4881dd6c583232ad4a96c76a07e53c626be9e742': 'SOWBTPS12A6D4FA5BE',\n",
       " 'dc94f3178afbf1bf19fd6f6998e6c16ad8d2af8e': 'SOCQOZB12AB0185685',\n",
       " '656684e0c8cd25284cbc29715b3669fd33018d1d': 'SOISNSU12AC468C0D8',\n",
       " 'e8184db22c453007c34ba8ab7e2a4cda8ca7969b': 'SOBKLTU12A58A7FB77',\n",
       " '88a3d389bc09b4134669fbb323fb7b5097bd2bc6': 'SOBKLTU12A58A7FB77',\n",
       " '74aaed120ead30a77a59825f581ff8224c4a0d99': 'SOEWPZY12A6D4FB168',\n",
       " '5c9f5711f7e4e655dc40a9379056952ca46c8d9e': 'SOYABSZ12A81C1FEAC',\n",
       " '76dac811f10bdb915b382f9359d9a19b62a76565': 'SOYSWHI12AAA8C5BFD',\n",
       " 'fb72bd9e9770c19c83991ebb9831225516052023': 'SOWBTPS12A6D4FA5BE',\n",
       " '4d00c09ea4a62be0e585b08297ecacf171764327': 'SOYABSZ12A81C1FEAC',\n",
       " '5e15708f384e6895491501f6ca4776593730359d': 'SOPGOJB12A8C13B05C',\n",
       " '19334da7554b18105bfb483d4753899622a3fbc8': 'SOPEFDW12AF72A1709',\n",
       " '970f4c8c179b7b4ec11fd8a6a6f46989c3f4be35': 'SOKUFKO12AB017F75F',\n",
       " '299edc1c5c7fbe90f5df3984f01db0780f067176': 'SOISNSU12AC468C0D8',\n",
       " 'fba132f8bb64c1f834adb425dfeac220d4887e89': 'SOWBTPS12A6D4FA5BE',\n",
       " 'aa23445d170fbfc9c5e523280f4dd8bb9ec156b3': 'SONTIBS12A6D4F9CFE',\n",
       " 'be9b66ad425f258a1cd46c94b9639954d2aed1e3': 'SOGPBAW12A6D4F9F22',\n",
       " '4ed54d423dde538cba69e45574acae7a8c591b83': 'SOGPBAW12A6D4F9F22',\n",
       " '93b372fed7f4335438896bc172ea3b06e631b186': 'SOJEHJV12A6D223C0C',\n",
       " '20fae0d15ad6ae9474cfebcb17bd7181f4dd77ca': 'SOBOUPA12A6D4F81F1',\n",
       " '2a0695707a9f1943b81a225a0dd81d182cbd7a6e': 'SOISNSU12AC468C0D8',\n",
       " '6bedbdc15f34241fa71faa8af93fa0423f638e40': 'SOSUGSC12A6D4FB0C4',\n",
       " '36b1f1a75621b7770a9846191cc20b2048117928': 'SOLAUOW12A8C13A400',\n",
       " 'a6ee8041ff774e533083c3bcbdbc6c82af2ee0d4': 'SOITFCH12A6D4F9478',\n",
       " '547904414cb1167a4166c1b5617e6ece01ffd715': 'SOBOUPA12A6D4F81F1',\n",
       " '0d92bc98d79f48bd47cecc9f5672c76a21a64b32': 'SOLAUOW12A8C13A400',\n",
       " '25018f5bda035f7124aacebd177b3d99f62639df': 'SOHZDYL12A8C141C73',\n",
       " 'caf0f79a56011a9c80bdf3f454e9da70173203d7': 'SOKZZGT12A67ADA4C3',\n",
       " '53bf5530eda7bfadbace84bfe03a5651e3909d9c': 'SOBBKGF12A8C1311EE',\n",
       " 'c62c3b8797be6523151dfd5c647f8b057b051595': 'SOKZZGT12A67ADA4C3',\n",
       " '5a1df2cef7ded3a592831d36c21e946862eb6699': 'SOCBQKE12AB018548E',\n",
       " '6b3e5a595d85a3af73442ed36c69e2e48925030a': 'SOCRVWC12A6310F991',\n",
       " 'beb043c48fa6f239def57db6a394e4a60f7b41eb': 'SOBBKGF12A8C1311EE',\n",
       " '07fef48faf774ccdb3a27656de846f53916fecb7': 'SOTFJGS12AB017F577',\n",
       " '35dc030d4fb44dc205b1afb5b41f7d6e879d4304': 'SOAMIQK12A6701D94F',\n",
       " '72f7b2012bee0fb4352a0722d7af72e6765ff274': 'SOTNEEA12A6D4F7F8D',\n",
       " '559a6022730e8bae51c3ccf82dff35808451b8fd': 'SOTJSCD12A8C14093B',\n",
       " 'f50d9fa2e144ddbd6e7a827fae83a9483e7fb849': 'SODCNEE12A6310E037',\n",
       " '7844fee5b054e229abcf2807f96bf2ecc63d579f': 'SOVYIYI12A8C138D88',\n",
       " '5137d31641f85ab6077ea75686e88305b28f7224': 'SOUKLPY12A8C1451A8',\n",
       " 'd38ac29ef6b78b40687c3422214ab5ba48a50784': 'SOBBKGF12A8C1311EE',\n",
       " 'ab21473d003eb9a588865d1622f29e9c56019f2f': 'SOAMIQK12A6701D94F',\n",
       " 'afa5849422e6dc7cbed81411bc4da7d9761d001a': 'SOSMXVH12A58A7CA6C',\n",
       " '1dfdeda072adaf6cf21ade16c3d3e033ae6fee4e': 'SOVYIYI12A8C138D88',\n",
       " '3c9d11b9af8068a2a62c178f373b9b2fd5e722dc': 'SOLAUOW12A8C13A400',\n",
       " 'e7ab01b924259a490cc6cc0adcc7445dbad2eeb4': 'SOJHCOH12A8AE45F4F',\n",
       " 'b2f7807e3769645c3cafa313c66187396a15c638': 'SOGPBAW12A6D4F9F22',\n",
       " '015f07a3a176e8c0276ecb5192d2a7ad309a5c76': 'SONIPQC12AB017B595',\n",
       " '979999aaab814e79c83d746f89090264fe7154a1': 'SOYBLYP12A58A79D32',\n",
       " '0e20da219bb8b1c88eb7f23199a67ce24d2ddcfe': 'SOISNSU12AC468C0D8',\n",
       " 'b5ce1aee7022232d1e4718f828f72721321848b2': 'SOBMKJU12A6D4F7128',\n",
       " '5fbd08fd5d6d29711b5a427b0990e8141580570b': 'SOGPBAW12A6D4F9F22',\n",
       " '446d305e8f99a964ebe17891ff981587bb37177d': 'SOYKFFK12A8C14391D',\n",
       " '1374291455e510727a94418853b0d2b4ba5bd041': 'SOTJSCD12A8C14093B',\n",
       " '842ba391e9483e5c8f67ebcd060a290023792cbf': 'SOHZDYL12A8C141C73',\n",
       " 'af7738f193a3b027970e14a0adb5b30ecaabc779': 'SOISNSU12AC468C0D8',\n",
       " 'fbfa491050665d23e36dfb907744fb6cab6f01b2': 'SOSGEGU12AB018188A',\n",
       " '317a727c51e6075054957a520fc20479654fad52': 'SOGPBAW12A6D4F9F22',\n",
       " '6845d0789fdb70b9a4e1895250855c7283c550e8': 'SOBKLTU12A58A7FB77',\n",
       " '3d7e7c56a57c5da9ad8955fa56c96bbddba92bcc': 'SOGPBAW12A6D4F9F22',\n",
       " '533510a3185b5512aa87bbb88bece9356f1ccb25': 'SOGPBAW12A6D4F9F22',\n",
       " '8f2bc356ab3d3ea8c50d2f2b15d457f83a90712c': 'SOYKFFK12A8C14391D',\n",
       " '02a4255f067037ab82375a12d941a3df6ba93248': 'SOISNSU12AC468C0D8',\n",
       " 'df22f7fc0ff76a403cf47b121dfca0402fa840d3': 'SOYABSZ12A81C1FEAC',\n",
       " 'ce9b3559c2288cd1528a328f26e02535ee69be45': 'SOYKFFK12A8C14391D',\n",
       " '9732c7231c617a389fea3ab2006dc22e640ece9c': 'SOBMKJU12A6D4F7128',\n",
       " '22e6b2c523ec094300a69db2e3fa63861a3c3227': 'SOYABSZ12A81C1FEAC',\n",
       " 'f8d581f1a472ae796828dbf84e315b6df10b66a9': 'SOCBQKE12AB018548E',\n",
       " '03e58f0a99e2b865ade9f402dd3bf5fc03e4028a': 'SODYAQG12A6D4FD15C',\n",
       " '787ec675e9e5f8ee0de4e2b507a3f8ac9b0675fd': 'SOANSPC12A6702154A',\n",
       " '8183ff737ba6d93a987960a8ee085fb81a0cd0c4': 'SOYSWHI12AAA8C5BFD',\n",
       " '53eb55a6cb1c799496ee3a83cbe4009c0ad7ed16': 'SOKAESA12A8C1410A1',\n",
       " 'aa9d45f4a244f7ea07232d25e62828b82f512a06': 'SOYKFFK12A8C14391D',\n",
       " '8f06c511302dceeaf8699a7bd2cb89b2240e2499': 'SOCRVWC12A6310F991',\n",
       " '316e014ded2ef7bb50a21f8245fa8884d5ef9418': 'SOPEFDW12AF72A1709',\n",
       " '15410836c247fcf9564f1417dd37cb3360d3fe14': 'SOIDEPI12A6D4F98D2',\n",
       " 'a81e6b6c3e582061dfcd084ffd112eacedcf89d3': 'SONTIBS12A6D4F9CFE',\n",
       " '16eedec4453c97ffb4d712706b6a8edcdaade589': 'SOBOUPA12A6D4F81F1',\n",
       " '78f41a23ef3176c1d0a2fe59da2d0d511c689dd3': 'SOISNSU12AC468C0D8',\n",
       " '5df2432a0dfdecc20847c4586df20bae6c3d6440': 'SOBOUPA12A6D4F81F1',\n",
       " '01acaf55386f2cdcf87dd056562dcfbff6e8e114': 'SOGPBAW12A6D4F9F22',\n",
       " '46a5b5389e3dad41bcfdb0e56a1668d4a4f0dca2': 'SOZQSVB12A8C13C271',\n",
       " 'ca24766d93a0cec91f9c0f309a5b422ee311c99e': 'SOTJSCD12A8C14093B',\n",
       " 'd92f53c3a4fd48ff9b1423942d936c41179389fd': 'SOJSGZT12A58A7E75C',\n",
       " 'fee8ad5eb9ac59bb4770aa93597ebb4a9f40d4b4': 'SOXNZUH12AB018393F',\n",
       " '2c7add33357ab939f11ff9cb34b41c806a7d76c0': 'SOITFCH12A6D4F9478',\n",
       " 'b3fb032ed63d6cb759390935e769bc11af7302e5': 'SORWBEB12A58A78BF8',\n",
       " 'b8f5443e57817adc61f61b75ee925d4822cbd467': 'SOBBKGF12A8C1311EE',\n",
       " '8e031af2928ae2013dfe8cb7a663612bb4aa24b2': 'SOPCQRT12A8C13B15D',\n",
       " '7375e5337545cad94a9b560f6bf07aa1d04dd4e9': 'SOANSPC12A6702154A',\n",
       " '2ccf08a330a9815409d3e6561ddff4d9d6223f6e': 'SOGPBAW12A6D4F9F22',\n",
       " '9b4e80f1295ca0b55cbfdce553ff4b351086d8be': 'SOCPIVV12A6D4F7B4C',\n",
       " 'edcbe4c1aa967ece986246323db628b9b135b684': 'SOLAUOW12A8C13A400',\n",
       " '0b2b470e3fda0d8ad58cffc9a1256a88f60351d2': 'SOIZFIO12A6310DBBE',\n",
       " '728cb282267da73e53faad43a588f3279938f906': 'SOOROCA12AF72A07D1',\n",
       " 'ca89599559b9f345f784d809d03c519fe68335d4': 'SOGPBAW12A6D4F9F22',\n",
       " '595446a4965b4904236547ce7f5a843e15d373d1': 'SOQHOUQ12A6D4F8DA9',\n",
       " 'a2a36ee264ffa85cae1e6d26bb6623fd13cdc019': 'SOTNEEA12A6D4F7F8D',\n",
       " '52c7a965a857aa1f7906e83707e1b47d5172f05e': 'SOQXDXM12A8C134E8E',\n",
       " 'eb9760ba711ca273de453ea722c3581f43b8d6d5': 'SOISNSU12AC468C0D8',\n",
       " '62e225e526e83297aa46d51beff10af33ef540c3': 'SORJNMJ12A8C13D994',\n",
       " 'c44a1be0c1ace970face1aa317650f42d94cb2bc': 'SOOROCA12AF72A07D1',\n",
       " 'fc9b0a828bc11705ef7ff44aef8dc0ad308358fa': 'SOIZFIO12A6310DBBE',\n",
       " 'd2bc7b6d0a6bc63b04227e11e30e2745992061c5': 'SOISNSU12AC468C0D8',\n",
       " 'c7ed08c09f329a02d9af100e168440bd4e0439fb': 'SOBKLTU12A58A7FB77',\n",
       " '54d07c4eff369f457c7a5d1c0b9b6c48feb949f4': 'SOPGOJB12A8C13B05C',\n",
       " 'afb3d81afec83c472d6beebb124a32b1e14bbbbe': 'SOAMIQK12A6701D94F',\n",
       " ...}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "uid_to_song"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SOITFCH12A6D4F9478\n",
      "5\n"
     ]
    }
   ],
   "source": [
    "s_raw_id = uid_to_song['ebc2091c54ace128fb78c543f29a8fad9c42bbe5'] \n",
    "print(s_raw_id)\n",
    "s_inner_id = algo.trainset.to_inner_iid(s_raw_id)\n",
    "print(s_inner_id)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[7091, 13475, 0]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 总共就60首歌曲，这里我们找最近的3首歌曲\n",
    "s_neighbors = algo.get_neighbors(s_inner_id, k=3)\n",
    "s_neighbors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<generator object <genexpr> at 0x10cc655c8>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s_neighbors2 = (algo.trainset.to_raw_uid(inner_id) for inner_id in s_neighbors)\n",
    "s_neighbors2 = (uid_to_song[song_id] for song_id in s_neighbors2)\n",
    "s_neighbors2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SOFEJPJ12A8C145455\n",
      "SOFEJPJ12A8C145455\n",
      "SOYSWHI12AAA8C5BFD\n"
     ]
    }
   ],
   "source": [
    "for song in s_neighbors2:\n",
    "    print(song)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 推荐系统的性能评价\n",
    "\n",
    "准确率和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimating biases using als...\n",
      "Computing the pearson_baseline similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson_baseline similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson_baseline similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson_baseline similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson_baseline similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Evaluating RMSE, MAE of algorithm KNNBasic on 5 split(s).\n",
      "\n",
      "                  Fold 1  Fold 2  Fold 3  Fold 4  Fold 5  Mean    Std     \n",
      "RMSE (testset)    1.6138  1.6575  1.5818  1.5942  1.6419  1.6178  0.0284  \n",
      "MAE (testset)     1.1290  1.1487  1.1113  1.1196  1.1344  1.1286  0.0128  \n",
      "Fit time          139.01  114.48  108.95  110.63  109.34  116.48  11.43   \n",
      "Test time         3.65    3.43    3.16    3.48    3.38    3.42    0.16    \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'test_rmse': array([1.61381424, 1.65748983, 1.58180831, 1.59419818, 1.64188512]),\n",
       " 'test_mae': array([1.12897715, 1.14871329, 1.1112865 , 1.1195592 , 1.13441581]),\n",
       " 'fit_time': (139.00921082496643,\n",
       "  114.48123383522034,\n",
       "  108.95175385475159,\n",
       "  110.63278079032898,\n",
       "  109.34228610992432),\n",
       " 'test_time': (3.6522300243377686,\n",
       "  3.430933952331543,\n",
       "  3.1608340740203857,\n",
       "  3.481170892715454,\n",
       "  3.3830249309539795)}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from surprise.model_selection import cross_validate\n",
    "\n",
    "cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import defaultdict\n",
    "from surprise import Dataset\n",
    "from surprise import SVD\n",
    "from surprise import Reader\n",
    "from surprise import KNNBasic\n",
    "from surprise.model_selection import KFold\n",
    "\n",
    "\n",
    "data_file_path = './output/test_item.csv'\n",
    "reader = Reader(line_format='user item rating', sep=',')\n",
    "data = Dataset.load_from_file(data_file_path, reader=reader)\n",
    "kf = KFold(n_splits=5)\n",
    "algo = KNNBasic()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def precision_recall_at_k(predictions, k=10, threshold=3.5):\n",
    "\n",
    "    user_est_true = defaultdict(list)\n",
    "    for uid, _, true_r, est, _ in predictions:\n",
    "        user_est_true[uid].append((est, true_r))\n",
    "\n",
    "    precisions = dict()\n",
    "    recalls = dict()\n",
    "    for uid, user_ratings in user_est_true.items():\n",
    "        user_ratings.sort(key=lambda x: x[0], reverse=True)\n",
    "        n_rel = sum((true_r >= threshold) for (_, true_r) in user_ratings)\n",
    "        n_rec_k = sum((est >= threshold) for (est, _) in user_ratings[:k])\n",
    "        n_rel_and_rec_k = sum(((true_r >= threshold) and (est >= threshold))\n",
    "                              for (est, true_r) in user_ratings[:k])\n",
    "\n",
    "        precisions[uid] = n_rel_and_rec_k / n_rec_k if n_rec_k != 0 else 1\n",
    "        recalls[uid] = n_rel_and_rec_k / n_rel if n_rel != 0 else 1\n",
    "\n",
    "    return precisions, recalls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "0.9986989049116339\n",
      "0.9473056489211753\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "0.9980317113176599\n",
      "0.9487151448879169\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "0.9984802431610942\n",
      "0.948762483716891\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "0.9978277397632236\n",
      "0.9554686651460845\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "0.9972755013077593\n",
      "0.946817785527463\n"
     ]
    }
   ],
   "source": [
    "for trainset, testset in kf.split(data):\n",
    "    algo.fit(trainset)\n",
    "    predictions = algo.test(testset)\n",
    "    precisions, recalls = precision_recall_at_k(predictions, k=5, threshold=4)\n",
    "\n",
    "    print(sum(prec for prec in precisions.values()) / len(precisions))\n",
    "    print(sum(rec for rec in recalls.values()) / len(recalls))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimating biases using als...\n",
      "Computing the pearson_baseline similarity matrix...\n",
      "Done computing similarity matrix.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<surprise.prediction_algorithms.knns.KNNBasic at 0x10cc52908>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from surprise.model_selection import train_test_split\n",
    "\n",
    "data_file_path = './output/test_item.csv'\n",
    "data = Dataset.load_from_file(data_file_path, reader=reader)\n",
    "reader = Reader(line_format='user item rating', sep=',')\n",
    "trainset, testset = train_test_split(data, test_size=.4)\n",
    "\n",
    "sim_options = {'name': 'pearson_baseline', 'user_bases': True}\n",
    "algo = KNNBasic(sim_options=sim_options)\n",
    "algo.fit(trainset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = algo.test(testset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "precisions, recalls = precision_recall_at_k(predictions, k=5, threshold=4)\n",
    "print(sum(prec for prec in precisions.values()) / len(precisions))\n",
    "print(sum(rec for rec in recalls.values()) / len(recalls))"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "toc": {
   "nav_menu": {
    "height": "153px",
    "width": "160px"
   },
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "toc_cell": true,
   "toc_position": {
    "height": "691px",
    "left": "0px",
    "right": "1405px",
    "top": "106px",
    "width": "303px"
   },
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
